From ca3bf2a066eaec8b315b16cbc6f2b89f76624dd9 Mon Sep 17 00:00:00 2001 From: Horilla Date: Fri, 22 Sep 2023 16:29:50 +0530 Subject: [PATCH] [UPDT] Added condition in leave dashboard if today is a holiday --- leave/static/dashboard/dashboard.js | 27 +++++++- leave/templates/leave/dashboard.html | 63 +++++++++++------- leave/templates/leave/employee-dashboard.html | 38 +++++++---- .../leave/leave_request/leave-requests.html | 22 +++++- leave/views.py | 52 ++++++--------- static/images/ui/sunbed outline.png | Bin 0 -> 19807 bytes 6 files changed, 131 insertions(+), 71 deletions(-) create mode 100644 static/images/ui/sunbed outline.png diff --git a/leave/static/dashboard/dashboard.js b/leave/static/dashboard/dashboard.js index 72ab7e416..e49abca87 100644 --- a/leave/static/dashboard/dashboard.js +++ b/leave/static/dashboard/dashboard.js @@ -20,6 +20,18 @@ $(document).ready(function(){ year = today.getFullYear() $(".month").val(`${year}-${month}`) $("#dash_month").val(`${year}-${month}`) + + function isPieChartEmpty(chartData) { + if (!chartData || !chartData.dataset || chartData.dataset.length === 0) { + return true; + } + for (var i = 0; i < chartData.dataset[0].data.length; i++) { + if (chartData.dataset[0].data[i] != 0) { + return false; + } + } + return true; + } //Employee wise chart for available leaves function available_leave_chart (dataSet){ @@ -119,7 +131,7 @@ $(document).ready(function(){ // stacked: true, title: { display: true, - text: "Number of leaves", + text: "Number of days", font: { weight: "bold", size: 16, @@ -162,8 +174,17 @@ $(document).ready(function(){ url: "/leave/available-leaves", dataType: "json", success: function (response) { - available_leave_chart(response) - + if (isPieChartEmpty(response)){ + $("#availableLeaveContainer").html( + `
+
+

${response.message}

+
+
` + ) + }else{ + available_leave_chart(response) + } }, error: (error) => { console.log('Error', error); diff --git a/leave/templates/leave/dashboard.html b/leave/templates/leave/dashboard.html index 56538d29e..d40f7bc7a 100644 --- a/leave/templates/leave/dashboard.html +++ b/leave/templates/leave/dashboard.html @@ -2,6 +2,9 @@ {% load static %} {% load i18n %} {% block content %} +{% load tz %} + +{% now "Y-m-d" as current_date %}
@@ -23,7 +26,7 @@
- New Requests + {% trans "New Requests" %}
@@ -35,7 +38,7 @@
- Approved Requests + {% trans "Approved Requests" %}
@@ -47,7 +50,7 @@
- Rejected Requests + {% trans "Rejected Requests" %}
@@ -63,7 +66,7 @@
- Employee Leaves + {% trans "Employee Leaves" %}
@@ -95,13 +98,21 @@ {% endfor %}
- {% else %} + {% elif current_date == next_holiday.start_date|date:"Y-m-d" %}
- -

{% trans "Today, all employees are present." %}

+ +

{% trans "Today is a holiday." %}

-
+
+ + {% else %} +
+
+ +

{% trans "No leave requests for today." %}

+
+
{% endif %}
@@ -110,22 +121,21 @@
- -
-
- -
-
- Next Holiday - {{next_holiday.name}} - {{next_holiday.start_date}} -
+
+
+
+
+ {% trans "Next Holiday" %} + {{next_holiday.name}} + {{next_holiday.start_date}} +
+
- Up coming holidays + {% trans "Up coming holidays" %}
    @@ -153,16 +163,23 @@
    - Department Leaves + {% trans "Department Leaves" %}
    {% if leave_today_employees %} + {% elif current_date == next_holiday.start_date|date:"Y-m-d" %} +
    +
    + +

    {% trans "Today is a holiday." %}

    +
    +
    {% else %}
    -

    {% trans "Today, all employees are present." %}

    +

    {% trans "No leave requests for today." %}

    {% endif %} @@ -172,7 +189,7 @@
    - Leave Type + {% trans "Leave Type" %}
    {% if leave_requests %} @@ -191,7 +208,7 @@
    - Leave trend this week + {% trans "Leave trend this week" %}
    diff --git a/leave/templates/leave/employee-dashboard.html b/leave/templates/leave/employee-dashboard.html index 63d3c30f1..4209ee2ad 100644 --- a/leave/templates/leave/employee-dashboard.html +++ b/leave/templates/leave/employee-dashboard.html @@ -1,14 +1,28 @@ {% extends 'index.html' %} {% load static %} {% block content %} +{% load i18n %}
    -
    + +
    -
    +
    - New Requests + {% trans "New Requests" %}
    @@ -20,9 +34,9 @@
    -
    +
    - Approved Requests + {% trans "Approved Requests" %}
    @@ -32,9 +46,9 @@
    -
    +
    - Rejected Requests + {% trans "Rejected Requests" %}
    @@ -49,9 +63,9 @@
    - Overall Conversions + {% trans "Available Leaves" %}
    -
    +
    @@ -59,7 +73,7 @@
    - Total Leave Requests + {% trans "Total Leave Requests" %}
    @@ -80,7 +94,7 @@
    - Next Holiday + {% trans "Next Holiday" %} {{next_holiday.name}} {{next_holiday.start_date}}
    @@ -89,7 +103,7 @@
    - Up coming holidays + {% trans "Up coming holidays" %}
      diff --git a/leave/templates/leave/leave_request/leave-requests.html b/leave/templates/leave/leave_request/leave-requests.html index 918e4d73a..fd2ace83f 100644 --- a/leave/templates/leave/leave_request/leave-requests.html +++ b/leave/templates/leave/leave_request/leave-requests.html @@ -11,6 +11,22 @@
    {% endif %} {% include 'filter_tags.html' %} +{% if not dashboard %} +
    + + + {% trans "Cancelled" %} + + + + {% trans "Requested" %} + + +
    +{% endif %}
    @@ -31,15 +47,15 @@ {% for leave_request in leave_requests %}
    -
    +
    {% if leave_request.employee_id.employee_profile %} {{leave_request.employee_id}} + alt="" /> {% else %} {{leave_request.employee_id}} + class="oh-profile__image" alt="" /> {% endif %}
    {{leave_request.employee_id}} diff --git a/leave/views.py b/leave/views.py index e177ede21..7ccf3c1d1 100644 --- a/leave/views.py +++ b/leave/views.py @@ -289,10 +289,14 @@ def leave_request_filter(request): if not request.GET.get("dashboard"): data_dict = parse_qs(previous_data) get_key_instances(LeaveRequest, data_dict) + if 'status' in data_dict: + status_list = data_dict['status'] + if len(status_list) > 1: + data_dict['status'] = [status_list[-1]] return render( request, "leave/leave_request/leave-requests.html", - {"leave_requests": page_obj, "pd": previous_data, "filter_dict": data_dict}, + {"leave_requests": page_obj, "pd": previous_data, "filter_dict": data_dict,"dashboard":request.GET.get("dashboard")}, ) @@ -1515,7 +1519,7 @@ def dashboard(request): approved=leave_requests.filter(status="approved") cancelled=leave_requests.filter(status="cancelled") holidays = Holiday.objects.filter(start_date__gte = today) - next_holiday = holidays[0] if holidays else None + next_holiday = holidays.order_by('start_date').first() if holidays.exists() else None holidays = holidays.filter(start_date__gte = today,start_date__month=today.month).order_by('start_date')[1:] @@ -1538,16 +1542,17 @@ def dashboard(request): def employee_dashboard(request): today = date.today() user=Employee.objects.get(employee_user_id = request.user) - leave_requests = LeaveRequest.objects.filter(employee_id=user,start_date__month=today.month,start_date__year=today.year) + leave_requests = LeaveRequest.objects.filter(employee_id=user) requested=leave_requests.filter(status="requested") approved=leave_requests.filter(status="approved") cancelled=leave_requests.filter(status="cancelled") - holidays = Holiday.objects.filter(start_date__gte = today,start_date__month=today.month).order_by('start_date') - next_holiday, holidays = (holidays[0], holidays[1:]) if holidays else (None, []) + holidays = Holiday.objects.filter(start_date__gte = today) + next_holiday = holidays.order_by('start_date').first() if holidays.exists() else None + holidays = holidays.filter(start_date__gte = today,start_date__month=today.month).order_by('start_date')[1:] context = { - "leave_requests":leave_requests, + "leave_requests":leave_requests.filter(start_date__month=today.month,start_date__year=today.year), "requested":requested, "approved":approved, "cancelled":cancelled, @@ -1592,12 +1597,13 @@ def available_leave_chart(request): response={ "labels":labels, "dataset":dataset, + "message":_("Oops!! No leaves available for you this month...") } return JsonResponse(response) @login_required def employee_leave_chart(request): - leave_requests=LeaveRequest.objects.all() + leave_requests=LeaveRequest.objects.filter(status="approved") leave_types = LeaveType.objects.all() day = date.today() if request.GET.get("date"): @@ -1683,37 +1689,23 @@ def department_leave_chart(request): @login_required def leave_type_chart(request): - today=date.today() leave_types=LeaveType.objects.all() leave_type_count = {types.name: 0 for types in leave_types} leave_request=LeaveRequest.objects.filter(status="approved") - company_leave_dates = company_leave_dates_list(CompanyLeave.objects.all(),datetime.today().replace(day=1)) - holidays=holiday_dates_list(Holiday.objects.all()) for leave in leave_request: - leave_dates = [] - - for leave_date in leave.requested_dates(): - leave_dates.append(leave_date) - - filtered_dates = [date for date in leave_dates if date.month == today.month and date.year == today.year] - leave_type_dates = [] - for filtered in filtered_dates: - if filtered not in company_leave_dates and filtered not in holidays: - leave_type_dates.append(filtered) for lev in leave_types: - if lev ==leave.leave_type_id: - leave_type_count[lev.name] += len(leave_type_dates) - + if lev ==leave.leave_type_id: + leave_type_count[lev.name] += leave.requested_days + labels= [leave_type.name for leave_type in leave_types] - dataset=[ - { - "label":_(""), - "data":list(leave_type_count.values()), - }, - ] + response={ "labels":labels, - "dataset":dataset, + "dataset":[ + { + "data":list(leave_type_count.values()), + }, + ], } return JsonResponse(response) diff --git a/static/images/ui/sunbed outline.png b/static/images/ui/sunbed outline.png new file mode 100644 index 0000000000000000000000000000000000000000..e8d1fd822dfafd856db892a6fceeaa3a990e9ac5 GIT binary patch literal 19807 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 Q(N;Q`+FtiFxLbhsW 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 literal 0 HcmV?d00001