Prioritize active work and paginate completed engagements

This commit is contained in:
A R R R Associates
2026-08-10 12:17:51 +05:30
parent f79862203b
commit d8cb564dfc
3 changed files with 74 additions and 4 deletions
+36 -1
View File
@@ -3112,6 +3112,8 @@ def list_employee_work_kanban(
q: str = "", q: str = "",
status: str = "open", status: str = "open",
financial_year: str | None = None, financial_year: str | None = None,
completed_page: int = 1,
completed_page_size: int = 25,
) -> dict[str, Any]: ) -> dict[str, Any]:
"""Return exactly one employee-board card per assigned engagement. """Return exactly one employee-board card per assigned engagement.
@@ -3176,8 +3178,8 @@ def list_employee_work_kanban(
) )
columns = [ columns = [
{"code": "pending", "label": "Pending", "cards": []},
{"code": "in_progress", "label": "In Progress", "cards": []}, {"code": "in_progress", "label": "In Progress", "cards": []},
{"code": "pending", "label": "Pending", "cards": []},
{"code": "blocked", "label": "Blocked", "cards": []}, {"code": "blocked", "label": "Blocked", "cards": []},
{"code": "completed", "label": "Completed", "cards": []}, {"code": "completed", "label": "Completed", "cards": []},
] ]
@@ -3354,6 +3356,38 @@ def list_employee_work_kanban(
card["service_name"].lower(), card["service_name"].lower(),
) )
) )
column["total_cards"] = len(column["cards"])
try:
completed_page = max(int(completed_page or 1), 1)
except (TypeError, ValueError):
completed_page = 1
try:
completed_page_size = max(1, min(int(completed_page_size or 25), 100))
except (TypeError, ValueError):
completed_page_size = 25
completed_column = column_lookup["completed"]
completed_total = int(completed_column["total_cards"])
completed_pages = max(1, (completed_total + completed_page_size - 1) // completed_page_size)
if completed_page > completed_pages:
completed_page = completed_pages
completed_start = (completed_page - 1) * completed_page_size
completed_end = completed_start + completed_page_size
completed_column["cards"] = completed_column["cards"][completed_start:completed_end]
completed_pagination = {
"page": completed_page,
"page_size": completed_page_size,
"total": completed_total,
"pages": completed_pages,
"has_previous": completed_page > 1,
"has_next": completed_page < completed_pages,
"previous_page": completed_page - 1 if completed_page > 1 else None,
"next_page": completed_page + 1 if completed_page < completed_pages else None,
"start": completed_start + 1 if completed_total else 0,
"end": min(completed_end, completed_total),
}
return { return {
"summary": summary, "summary": summary,
@@ -3361,6 +3395,7 @@ def list_employee_work_kanban(
"q": q, "q": q,
"status": status_filter, "status": status_filter,
"today": today, "today": today,
"completed_pagination": completed_pagination,
} }
@@ -56,7 +56,7 @@
{% if column.code == 'blocked' %}<p class="mt-1 text-xs text-slate-500">Engagements waiting for documents, clarification, review or another dependency.</p>{% endif %} {% if column.code == 'blocked' %}<p class="mt-1 text-xs text-slate-500">Engagements waiting for documents, clarification, review or another dependency.</p>{% endif %}
{% if column.code == 'completed' %}<p class="mt-1 text-xs text-slate-500">All tasks assigned to you in these engagements are complete.</p>{% endif %} {% if column.code == 'completed' %}<p class="mt-1 text-xs text-slate-500">All tasks assigned to you in these engagements are complete.</p>{% endif %}
</div> </div>
<span class="rounded-full bg-white px-3 py-1 text-xs font-semibold text-slate-600">{{ column.cards|length }}</span> <span class="rounded-full bg-white px-3 py-1 text-xs font-semibold text-slate-600">{{ column.total_cards }}</span>
</div> </div>
<div class="overflow-x-auto rounded-2xl border border-slate-200 bg-white"> <div class="overflow-x-auto rounded-2xl border border-slate-200 bg-white">
@@ -182,6 +182,33 @@
</tbody> </tbody>
</table> </table>
</div> </div>
{% if column.code == 'completed' and work_payload.completed_pagination.pages > 1 %}
<div class="mt-4 flex flex-wrap items-center justify-between gap-3 rounded-xl border border-slate-200 bg-white px-4 py-3">
<div class="text-xs text-slate-500">
Showing {{ work_payload.completed_pagination.start }}-{{ work_payload.completed_pagination.end }} of {{ work_payload.completed_pagination.total }} completed engagements
</div>
<div class="flex items-center gap-2">
{% if work_payload.completed_pagination.has_previous %}
<form method="get" action="/employee/work">
<input type="hidden" name="q" value="{{ q or '' }}">
<input type="hidden" name="status" value="{{ status }}">
<input type="hidden" name="completed_page" value="{{ work_payload.completed_pagination.previous_page }}">
<button type="submit" class="rounded-lg border border-slate-300 bg-white px-3 py-1.5 text-xs font-semibold text-slate-700 hover:bg-slate-50">Previous</button>
</form>
{% endif %}
<span class="rounded-lg bg-slate-100 px-3 py-1.5 text-xs font-semibold text-slate-700">Page {{ work_payload.completed_pagination.page }} of {{ work_payload.completed_pagination.pages }}</span>
{% if work_payload.completed_pagination.has_next %}
<form method="get" action="/employee/work">
<input type="hidden" name="q" value="{{ q or '' }}">
<input type="hidden" name="status" value="{{ status }}">
<input type="hidden" name="completed_page" value="{{ work_payload.completed_pagination.next_page }}">
<button type="submit" class="rounded-lg border border-slate-300 bg-white px-3 py-1.5 text-xs font-semibold text-slate-700 hover:bg-slate-50">Next</button>
</form>
{% endif %}
</div>
</div>
{% endif %}
</section> </section>
{% endfor %} {% endfor %}
</div> </div>
+10 -2
View File
@@ -2027,7 +2027,7 @@ def employee_my_work_task_status(
@portal_router.get("/work") @portal_router.get("/work")
def employee_my_work(request: Request, q: str = "", status: str = "open"): def employee_my_work(request: Request, q: str = "", status: str = "open", completed_page: int = 1):
db = CommonSessionLocal() db = CommonSessionLocal()
try: try:
current_user = get_current_user(request, db=db) current_user = get_current_user(request, db=db)
@@ -2042,7 +2042,15 @@ def employee_my_work(request: Request, q: str = "", status: str = "open"):
scope = build_employee_scope(db, current_user, tenant_id=tenant_id, branch_id=branch_id) scope = build_employee_scope(db, current_user, tenant_id=tenant_id, branch_id=branch_id)
employee = get_employee_for_user(db, current_user) employee = get_employee_for_user(db, current_user)
financial_year = _active_financial_year(request) financial_year = _active_financial_year(request)
work_payload = list_employee_work_kanban(db, scope, q=q, status=status, financial_year=financial_year) work_payload = list_employee_work_kanban(
db,
scope,
q=q,
status=status,
financial_year=financial_year,
completed_page=completed_page,
completed_page_size=25,
)
return _render( return _render(
request, request,
"modules/employees/templates/employees/self_work.html", "modules/employees/templates/employees/self_work.html",