diff --git a/attendance/forms.py b/attendance/forms.py index f1a538836..fd104c701 100644 --- a/attendance/forms.py +++ b/attendance/forms.py @@ -204,7 +204,10 @@ class AttendanceUpdateForm(ModelForm): self.fields["shift_id"].widget.attrs.update( { "id": str(uuid.uuid4()), - "onchange": "shiftChange($(this))", + "hx-include": "#attendanceUpdateForm", + "hx-target": "#attendanceUpdateForm", + "hx-trigger": "change", + "hx-get": "/attendance/update-fields-based-shift", } ) self.fields["attendance_date"].widget.attrs.update( @@ -278,22 +281,30 @@ class AttendanceForm(ModelForm): } def __init__(self, *args, **kwargs): + # Get the initial data passed from the view + view_initial = kwargs.pop("initial", {}) + + # Default initial values initial = { "attendance_clock_out_date": datetime.datetime.today() .date() .strftime("%Y-%m-%d"), "attendance_clock_out": datetime.datetime.today().time().strftime("%H:%M"), } + + # If an instance is provided, override the default initial values if instance := kwargs.get("instance"): - # django forms not showing value inside the date, time html element. - # so here overriding default forms instance method to set initial value - initial = { - "attendance_date": instance.attendance_date.strftime("%Y-%m-%d"), - "attendance_clock_in": instance.attendance_clock_in.strftime("%H:%M"), - "attendance_clock_in_date": instance.attendance_clock_in_date.strftime( - "%Y-%m-%d" - ), - } + initial.update( + { + "attendance_date": instance.attendance_date.strftime("%Y-%m-%d"), + "attendance_clock_in": instance.attendance_clock_in.strftime( + "%H:%M" + ), + "attendance_clock_in_date": instance.attendance_clock_in_date.strftime( + "%Y-%m-%d" + ), + } + ) if instance.attendance_clock_out_date is not None: initial["attendance_clock_out"] = ( instance.attendance_clock_out.strftime("%H:%M") @@ -301,14 +312,21 @@ class AttendanceForm(ModelForm): initial["attendance_clock_out_date"] = ( instance.attendance_clock_out_date.strftime("%Y-%m-%d") ) + + # Merge with initial values passed from the view + initial.update(view_initial) kwargs["initial"] = initial + super().__init__(*args, **kwargs) reload_queryset(self.fields) self.fields["employee_id"].widget.attrs.update({"id": str(uuid.uuid4())}) self.fields["shift_id"].widget.attrs.update( { "id": str(uuid.uuid4()), - "onchange": "shiftChange($(this))", + "hx-include": "#attendanceCreateForm", + "hx-target": "#attendanceCreateForm", + "hx-trigger": "change", + "hx-get": "/attendance/update-fields-based-shift", } ) self.fields["attendance_date"].widget.attrs.update( @@ -560,7 +578,11 @@ class AttendanceRequestForm(ModelForm): self.fields["shift_id"].widget.attrs.update( { "id": str(uuid.uuid4()), - "onchange": "shiftChange($(this))", + "hx-include": "#attendanceRequestForm", + "hx-target": "#attendanceRequestDiv", + "hx-trigger": "change", + "hx-swap": "outerHTML", + "hx-get": "/attendance/update-fields-based-shift", } ) self.fields["attendance_date"].widget.attrs.update( @@ -609,7 +631,8 @@ class NewRequestForm(AttendanceRequestForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - + # Get the initial data passes from views.py file + view_initial = kwargs.pop("initial", {}) # Add the new model choice field to the form at the beginning old_dict = self.fields new_dict = { @@ -624,6 +647,7 @@ class NewRequestForm(AttendanceRequestForm): "hx-trigger": "change", } ), + initial=view_initial.get("employee_id"), ), "create_bulk": forms.BooleanField( required=False, @@ -642,6 +666,8 @@ class NewRequestForm(AttendanceRequestForm): new_dict.update(old_dict) self.fields = new_dict + kwargs["initial"] = view_initial + def as_p(self, *args, **kwargs): """ Render the form fields as HTML table rows with Bootstrap styling. diff --git a/attendance/templates/attendance/attendance/attendance_view.html b/attendance/templates/attendance/attendance/attendance_view.html index d1860f212..dfa8a0200 100644 --- a/attendance/templates/attendance/attendance/attendance_view.html +++ b/attendance/templates/attendance/attendance/attendance_view.html @@ -1,132 +1,77 @@ -{% extends 'index.html' %} {% block content %} {% load static %} {% load i18n %} -{% load basefilters %} {% include 'attendance/attendance/attendance_nav.html' %} +{% extends 'index.html' %} +{% block content %} +{% load i18n %} +{% load static %} +{% load basefilters %} +{% include 'attendance/attendance/attendance_nav.html' %}