Prioritize active work and paginate completed engagements
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
Reference in New Issue
Block a user