Ajaxify employee portal dashboard

This commit is contained in:
A R R R Associates
2026-07-05 21:08:14 +05:30
parent a2fbe9d492
commit e0d60922fe
12 changed files with 543 additions and 311 deletions
+73 -17
View File
@@ -2472,8 +2472,56 @@ def employee_status_submit(
db.close()
EMPLOYEE_PORTAL_TABS = {
"overview": "modules/employees/templates/employees/portal_partials/overview.html",
"work": "modules/employees/templates/employees/portal_partials/work.html",
"attendance": "modules/employees/templates/employees/portal_partials/attendance.html",
"profile": "modules/employees/templates/employees/portal_partials/profile.html",
"leave": "modules/employees/templates/employees/portal_partials/leave.html",
"documents": "modules/employees/templates/employees/portal_partials/documents.html",
"payslips": "modules/employees/templates/employees/portal_partials/payslips.html",
"offboarding": "modules/employees/templates/employees/portal_partials/offboarding.html",
"alerts": "modules/employees/templates/employees/portal_partials/alerts.html",
}
def _employee_portal_context(request: Request, db, current_user, *, active_tab: str = "overview"):
employee = get_employee_for_user(db, current_user)
pending_request = None if employee else get_pending_registration_for_user(db, current_user)
work_payload = None
if employee:
scope = build_employee_scope(
db,
current_user,
tenant_id=request.session.get("active_tenant_id") or current_user.tenant_id,
branch_id=request.session.get("active_branch_id"),
)
work_payload = list_employee_work_kanban(
db,
scope,
q="",
status="open",
financial_year=_active_financial_year(request),
)
return {
"title": "Employee Portal",
"active_tab": active_tab if active_tab in EMPLOYEE_PORTAL_TABS else "overview",
"employee": employee,
"pending_request": pending_request,
"today_attendance": get_today_attendance_for_user(db, current_user),
"attendance_rows": list_own_attendance(db, current_user, limit=10),
"leave_balances": list_own_leave_balances(db, current_user),
"leave_requests": list_own_leave_requests(db, current_user)[:5],
"offboarding_requests": list_own_offboarding_requests(db, current_user)[:5],
"payslips": list_own_payslips(db, current_user)[:5],
"own_documents": list_own_employee_documents(db, current_user)[:8],
"work_payload": work_payload,
}
@portal_router.get("/dashboard")
def employee_portal_dashboard(request: Request):
def employee_portal_dashboard(request: Request, tab: str = "overview"):
db = CommonSessionLocal()
try:
current_user = get_current_user(request, db=db)
@@ -2483,32 +2531,40 @@ def employee_portal_dashboard(request: Request):
require_permission(db, current_user, "employees.ess.view")
except Exception:
return _redirect_denied()
employee = get_employee_for_user(db, current_user)
pending_request = None if employee else get_pending_registration_for_user(db, current_user)
work_payload = None
if employee:
scope = build_employee_scope(db, current_user, tenant_id=request.session.get("active_tenant_id") or current_user.tenant_id, branch_id=request.session.get("active_branch_id"))
work_payload = list_employee_work_kanban(db, scope, q="", status="open", financial_year=_active_financial_year(request))
active_tab = tab if tab in EMPLOYEE_PORTAL_TABS else "overview"
return _render(
request,
"modules/employees/templates/employees/portal_dashboard.html",
db,
current_user,
title="Employee Portal",
employee=employee,
pending_request=pending_request,
today_attendance=get_today_attendance_for_user(db, current_user),
attendance_rows=list_own_attendance(db, current_user)[:7],
leave_balances=list_own_leave_balances(db, current_user),
leave_requests=list_own_leave_requests(db, current_user)[:5],
offboarding_requests=list_own_offboarding_requests(db, current_user)[:5],
payslips=list_own_payslips(db, current_user)[:5],
work_payload=work_payload,
**_employee_portal_context(request, db, current_user, active_tab=active_tab),
)
finally:
db.close()
@portal_router.get("/dashboard/tab/{tab_name}")
def employee_portal_dashboard_tab(request: Request, tab_name: str):
db = CommonSessionLocal()
try:
current_user = get_current_user(request, db=db)
if not current_user:
return _redirect_login()
try:
require_permission(db, current_user, "employees.ess.view")
except Exception:
return _redirect_denied()
active_tab = tab_name if tab_name in EMPLOYEE_PORTAL_TABS else "overview"
return _render(
request,
EMPLOYEE_PORTAL_TABS[active_tab],
db,
current_user,
**_employee_portal_context(request, db, current_user, active_tab=active_tab),
)
finally:
db.close()
@portal_router.get("/attendance")
def employee_self_attendance(request: Request):
db = CommonSessionLocal()