ui changes to the forms and the list page

This commit is contained in:
Faheedkhan 2025-07-15 14:25:39 +03:00
parent 4487ba68f5
commit cacb9f5ee6
18 changed files with 433 additions and 202 deletions

View File

View File

@ -297,7 +297,7 @@ def dealer_signup(request):
:rtype: Union[django.http.HttpResponse, django.http.JsonResponse] :rtype: Union[django.http.HttpResponse, django.http.JsonResponse]
""" """
if request.method == "POST": if request.method == "POST":
data = json.loads(request.body) data = json.loads(request.body)
email = data.get("email") email = data.get("email")
@ -4236,6 +4236,18 @@ def sales_list_view(request, dealer_slug):
qs = models.ExtraInfo.get_sale_orders(staff=staff) qs = models.ExtraInfo.get_sale_orders(staff=staff)
except Exception as e: except Exception as e:
print(e) print(e)
print(qs[0])
# query = request.GET.get('q')
# # if query:
# # qs = qs.filter(
# # Q(order_number__icontains=query) |
# # Q(customer__name__icontains=query) |
# # Q(item_details__icontains=query)
# # ).distinct()
# for so in qs:
# if query in so.customer_customer
paginator = Paginator(qs, 30) paginator = Paginator(qs, 30)
page_number = request.GET.get("page") page_number = request.GET.get("page")
@ -4323,6 +4335,7 @@ class EstimateListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
related_content_type=ContentType.objects.get_for_model(models.Staff), related_content_type=ContentType.objects.get_for_model(models.Staff),
related_object_id=staff.pk, related_object_id=staff.pk,
) )
context["staff_estimates"] = qs context["staff_estimates"] = qs
return context return context
def get_queryset(self): def get_queryset(self):
@ -4330,8 +4343,17 @@ class EstimateListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
entity = dealer.entity entity = dealer.entity
status = self.request.GET.get("status") status = self.request.GET.get("status")
queryset = entity.get_estimates() queryset = entity.get_estimates()
if status: if status:
queryset = queryset.filter(status=status) queryset = queryset.filter(status=status)
search_query = self.request.GET.get('q', '').strip()
if search_query:
queryset = queryset.filter(
Q(quotation_number__icontains=search_query) |
Q(customer__name__icontains=search_query)
).distinct()
return queryset return queryset

View File

@ -45,7 +45,7 @@
} }
.form-control, .form-select { .form-control, .form-select {
/* text-align: center; */ text-align: center;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;

View File

@ -6,7 +6,7 @@
{% trans "Sign In" %} {% trans "Sign In" %}
{% endblock head_title %} {% endblock head_title %}
{% block content %} {% block content %}
<section class="main my-2"> <section class="main mt-2">
<div class="row flex-center "> <div class="row flex-center ">
<div class="col-sm-10 col-md-8 col-lg-5 col-xl-5 col-xxl-3"> <div class="col-sm-10 col-md-8 col-lg-5 col-xl-5 col-xxl-3">
@ -22,20 +22,20 @@
<h3 class="mb-4">{% trans "Sign In" %}</h3> <h3 class="mb-4">{% trans "Sign In" %}</h3>
{% if not SOCIALACCOUNT_ONLY %} {% if not SOCIALACCOUNT_ONLY %}
</div>
<form method="post" action="{% url 'account_login' %}" class="form needs-validation" novalidate dir="rtl"> <form method="post" action="{% url 'account_login' %}" class="form needs-validation" novalidate >
{% csrf_token %} {% csrf_token %}
<div class="mb-3 text-start"> <div class="mb-3 ">
<label class="form-label" for="id_login" >{{ _("Email") }}</label> <label class="form-label" for="id_login" >{{ _("Email") }}</label>
<div class="form-icon-container"> <div class="form-icon-container">
<input type="email" name="login" id="id_login" class="form-control form-icon-input placeholder-center" placeholder="{{ _("Email") }}" required> <input type="email" name="login" id="id_login" class="form-control form-icon-input placeholder-center" placeholder="{{ _("Email") }}" required >
<span class="fas fa-user text-body fs-9 form-icon"></span> <span class="fas fa-user text-body fs-9 form-icon"></span>
</div> </div>
</div> </div>
<div class="mb-3 text-start"> <div class="mb-3 ">
<label class="form-label" for="id_password">{{ _("Password") }}</label> <label class="form-label" for="id_password">{{ _("Password") }}</label>
<div class="form-icon-container"> <div class="form-icon-container">
<input type="password" name="password" id="id_password" class="form-control form-icon-input placeholder-center" placeholder="{{ _("Password") }}" required> <input type="password" name="password" id="id_password" class="form-control form-icon-input placeholder-center" placeholder="{{ _("Password") }}" required >
<span class="fas fa-key text-body fs-9 form-icon"></span> <span class="fas fa-key text-body fs-9 form-icon"></span>
</div> </div>
</div> </div>
@ -63,7 +63,7 @@
<section class="pt-lg-0 pt-xl-8"> <section class="pt-lg-0 pt-xl-8">
{% include 'footer.html' %} {% include 'footer.html' %}
</section> </section>
{% if LOGIN_BY_CODE_ENABLED or PASSKEY_LOGIN_ENABLED %} {% if LOGIN_BY_CODE_ENABLED or PASSKEY_LOGIN_ENABLED %}
<hr> <hr>
{% element button_group vertical=True %} {% element button_group vertical=True %}

View File

@ -4,8 +4,9 @@
{% block content %} {% block content %}
<section class="main my-2"> <section class="main my-2">
<div class="container-fluid"> <div class="container" style="max-width:60rem;">
<div class="row form-container" id="form-container"> <div class="row form-container" id="form-container">
<div class="col-12 "><a class="d-flex flex-center text-decoration-none mb-4" href="{% url 'home' %}"> <div class="col-12 "><a class="d-flex flex-center text-decoration-none mb-4" href="{% url 'home' %}">

View File

@ -1,7 +1,9 @@
{% extends 'base.html' %}
{% extends 'base.html' %}
{% load i18n %}
{% load crispy_forms_filters %}
{% block content %} {% block content %}
<div class="d-flex justify-content-center align-items-center mt-10"> {% comment %} <div class="d-flex justify-content-center align-items-center mt-10">
<div class="text-center"> <div class="text-center">
<h1>Activate Account</h1> <h1>Activate Account</h1>
<p>Are you sure you want to activate this account "{{ obj.email }}"?</p> <p>Are you sure you want to activate this account "{{ obj.email }}"?</p>
@ -13,5 +15,38 @@
</div> </div>
</form> </form>
</div> </div>
</div> </div> {% endcomment %}
<!---->
<div class="row justify-content-center mt-5 mb-3">
<div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center text-white">
{% trans 'Activate Account'%}
</h3>
</div>
<div class="card-body bg-light-subtle">
<p class="text-center">Are you sure you want to activate this account "{{ obj.email }}"?</p>
<form method="post">
{% csrf_token %}
<hr class="my-2">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-lg btn-phoenix-primary md-me-2" type="submit">{{ _("Activate") }}</button>
<a class="btn btn-lg btn-phoenix-danger mx-2" href="{% url 'user_management' request.dealer.slug %}">Cancel</a>
</div>
</form>
</div>
</div>
</div>
</div>
<!---->
{% endblock %} {% endblock %}

View File

@ -1,7 +1,7 @@
{% extends 'base.html' %} {% extends 'base.html' %}
{% load i18n %}
{% block content %} {% block content %}
<div class="d-flex justify-content-center align-items-center mt-10"> {% comment %} <div class="d-flex justify-content-center align-items-center mt-10">
<div class="text-center"> <div class="text-center">
<h1 class="display-4">Delete Account</h1> <h1 class="display-4">Delete Account</h1>
<p class="lead">Are you sure you want to delete this account "{{ obj.email }}"? This will delete all associated information for this user.</p> <p class="lead">Are you sure you want to delete this account "{{ obj.email }}"? This will delete all associated information for this user.</p>
@ -13,6 +13,39 @@
</div> </div>
</form> </form>
</div> </div>
</div> </div> {% endcomment %}
<!---->
<div class="row justify-content-center mt-5 mb-3">
<div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center text-white">
{% trans 'Delete Account'%}
</h3>
</div>
<div class="card-body bg-light-subtle">
<p class="lead text-center">Are you sure you want to delete this account "{{ obj.email }}"? This will delete all associated information for this user.</p>
<form method="post">
{% csrf_token %}
<hr class="my-2">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-lg btn-phoenix-danger md-me-2" type="submit"><i class="fas fa-trash me-2"></i>{{ _("Delete Permenantly") }}</button>
<a class="btn btn-lg btn-phoenix-secondary mx-2" href="{% url 'user_management' request.dealer.slug %}"><i class="fas fa-ban me-2"></i>Cancel</a>
</div>
</form>
</div>
</div>
</div>
</div>
<!---->
{% endblock %} {% endblock %}

View File

@ -73,7 +73,7 @@
{% block content %} {% block content %}
<div class="container mt-4"> <div class="container mt-4">
<h2>Upload Cars CSV</h2> <h2>Upload Cars CSV <i class="fa-solid fa-file-csv text-primary"></i></h2>
<div class="d-flex justify-content-end"> <div class="d-flex justify-content-end">
<a href="{% static 'sample/cars_sample.csv' %}" class="btn btn-phoenix-success mt-4"> <a href="{% static 'sample/cars_sample.csv' %}" class="btn btn-phoenix-success mt-4">
<i class="fa-solid fa-file-csv me-2"></i>Download Sample CSV <i class="fa-solid fa-file-csv me-2"></i>Download Sample CSV

View File

@ -5,10 +5,9 @@
{% block title %}{{ _("Update Dealer Information") }}{% endblock title %} {% block title %}{{ _("Update Dealer Information") }}{% endblock title %}
{% block content %} {% block content %}
<div class="row my-5"> {% comment %} <div class="row my-5">
<div class="col-md-8"> <div class="col-md-8">
<!-- Form Header --> <!-- Form Header -->
<h3 class="mb-3">{{ _("Update Dealer Information") }}</h3> <h3 class="mb-3">{{ _("Update Dealer Information") }}</h3>
<form method="post" enctype="multipart/form-data" class="needs-validation" novalidate> <form method="post" enctype="multipart/form-data" class="needs-validation" novalidate>
@ -24,5 +23,36 @@
</form> </form>
</div> </div>
</div> </div> {% endcomment %}
<!---->
<div class="row justify-content-center mt-5 mb-3">
<div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center text-white">
{{ _("Update Dealer Information") }}
</h3>
</div>
<div class="card-body bg-light-subtle">
<form method="post" enctype="multipart/form-data" class="needs-validation" novalidate>
{% csrf_token %}
{{ form|crispy }}
<hr class="my-2">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
<a href="{{request.META.HTTP_REFERER}}" class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
</div>
</form>
</div>
</div>
</div>
</div>
<!---->
{% endblock %} {% endblock %}

View File

@ -13,7 +13,7 @@
{% block content %} {% block content %}
<div class="row mt-4"> {% comment %} <div class="row mt-4">
<div class="row"> <div class="row">
<div class="col-sm-9"> <div class="col-sm-9">
<div class="d-sm-flex justify-content-between"> <div class="d-sm-flex justify-content-between">
@ -48,5 +48,45 @@
</form> </form>
</div> </div>
</div> </div>
</div> </div> {% endcomment %}
<!---->
<div class="row justify-content-center mt-5 mb-3">
<div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center text-white">
{% if staff.created %}
{{ _("Edit Group") }}
{% else %}
{{ _("Add Group") }}
{% endif %}
</h3>
</div>
<div class="card-body bg-light-subtle">
<form class="row g-3 " method="post" class="form" novalidate>
{% csrf_token %}
{{ redirect_field }}
{{ form|crispy }}
{% for error in form.errors %}
<div class="text-danger">{{ error }}</div>
{% endfor %}
<hr class="my-2">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
<a href="{{request.META.HTTP_REFERER}}" class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
</div>
</form>
</div>
</div>
</div>
</div>
<!---->
{% endblock %} {% endblock %}

View File

@ -6,7 +6,7 @@
{% trans 'Edit Car' %} {% trans 'Edit Car' %}
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<div class="row"> {% comment %} <div class="row">
<div class="card rounded shadow mt-3"> <div class="card rounded shadow mt-3">
<p class="card-header bg-primary text-white rounded-top fw-bold">{% trans 'Edit Car' %}</p> <p class="card-header bg-primary text-white rounded-top fw-bold">{% trans 'Edit Car' %}</p>
<div class="card-body"> <div class="card-body">
@ -20,5 +20,38 @@
</form> </form>
</div> </div>
</div> </div>
</div> </div> {% endcomment %}
<!---->
<div class="row justify-content-center mt-5 mb-3">
<div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center text-white">
{% trans 'Edit Car' %}
</h3>
</div>
<div class="card-body bg-light-subtle">
<form method="post" class="needs-validation" novalidate>
{% csrf_token %} {{ form|crispy }}
<!-- Save and Back Buttons -->
<hr class="my-2">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
<a href="{{request.META.HTTP_REFERER}}" class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
</div>
</form>
</div>
</div>
</div>
</div>
<!---->
{% endblock %} {% endblock %}

View File

@ -6,7 +6,7 @@
{% trans "Car Finance Details" %} {% trans "Car Finance Details" %}
{% endblock %} {% endblock %}
{% block content %} {% block content %}
<div class="row p-4"> {% comment %} <div class="row p-4">
<p class="mb-4"> <p class="mb-4">
{% trans "Finance Details for" %} {% trans "Finance Details for" %}
{{ car.id_car_make.get_local_name }} - {{ car.id_car_model.get_local_name }} {{ car.id_car_make.get_local_name }} - {{ car.id_car_model.get_local_name }}
@ -38,6 +38,56 @@
<a href="{{ request.META.HTTP_REFERER }}" class="btn btn-sm btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a> <a href="{{ request.META.HTTP_REFERER }}" class="btn btn-sm btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
</div> </div>
</form> </form>
</div> </div> {% endcomment %}
<!---->
<div class="row justify-content-center mt-5 mb-3">
<div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center text-white">
{% trans "Finance Details for" %}{{ car.id_car_make.get_local_name }} - {{ car.id_car_model.get_local_name }}
</h3>
{% if form.errors %}
<div class="alert alert-danger">
<ul>
{% for field in form %}
{% for error in field.errors %}<li>{{ field.label }}: {{ error }}</li>{% endfor %}
{% endfor %}
{% for error in form.non_field_errors %}<li>{{ error }}</li>{% endfor %}
</ul>
</div>
{% endif %}
</div>
<div class="card-body bg-light-subtle">
<form method="post" class="needs-validation" novalidate>
<div class="row g-1">
<div class="col-lg-4 col-xl-12">
{% csrf_token %}
{{ form|crispy }}
</div>
</div>
<hr class="my-2">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
<a href="{{request.META.HTTP_REFERER}}" class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
</div>
</form>
</div>
</div>
</div>
</div>
<!---->
<!-- JavaScript Section --> <!-- JavaScript Section -->
{% endblock %} {% endblock %}

View File

@ -3,11 +3,11 @@
{%block title%} {% trans 'Billing Information'%}{%endblock%} {%block title%} {% trans 'Billing Information'%}{%endblock%}
{% block content %} {% block content %}
<div class="row mb-3"> {% comment %} <div class="row mb-3">
<div class="col-sm-6"> <div class="col-sm-6">
<form action="{% url 'billing_info' %}{% if request.GET.next %}?next={{ request.GET.next }}{% endif %}" method="post" class="form"> <form action="{% url 'billing_info' %}{% if request.GET.next %}?next={{ request.GET.next }}{% endif %}" method="post" class="form">
{% comment %} <legend>{% trans "Provide billing data"|upper %}</legend> {% endcomment %}
<h3>{% trans "Provide billing data"|upper %}</h3> <h3>{% trans "Provide billing data"|upper %}</h3>
{% csrf_token %} {% csrf_token %}
{{ form|crispy }} {{ form|crispy }}
@ -21,5 +21,44 @@
</form> </form>
</div> </div>
</div> </div> {% endcomment %}
<!---->
<div class="row justify-content-center mt-5 mb-3">
<div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center text-white">
{% trans "Provide billing data"|upper %}
</h3>
</div>
<div class="card-body bg-light-subtle">
<form action="{% url 'billing_info' %}{% if request.GET.next %}?next={{ request.GET.next }}{% endif %}" method="post" class="form">
{% csrf_token %}
{{ form|crispy }}
<hr class="my-2">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
{% if object %}
<a class="btn btn-lg btn-phoenix-danger " href="{% url 'billing_info_delete' %}"><i class="fa-solid fa-trash me-1"></i> {{ _("Delete") }}</a>
{% endif %}
</div>
</form>
</div>
</div>
</div>
</div>
<!---->
{% endblock %} {% endblock %}

View File

@ -45,11 +45,15 @@
.form-label { .form-label {
font-weight: 500; font-weight: 500;
} }
#pricing_container{
max-width:60rem;
}
</style> </style>
{% endblock customCSS %} {% endblock customCSS %}
{% block content %} {% block content %}
<div class="container py-5"> <div class="container py-5" id="pricing_container">
<h1 class="text-center mb-5 text-primary">{{ _("Choose Your Plan")}}</h1> <h1 class="text-center mb-5 text-primary">{{ _("Choose Your Plan")}}</h1>
<form method="POST" action="{% url 'submit_plan' request.dealer.slug %}" id="wizardForm"> <form method="POST" action="{% url 'submit_plan' request.dealer.slug %}" id="wizardForm">
{% csrf_token %} {% csrf_token %}
@ -200,10 +204,14 @@
<div class="col-lg-8 col-md-10"> <div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-0 rounded-3"> <div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3"> <div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
4. {{ _("Confirm Your Information")}} <h3 class="mb-0 fs-4 text-center text-white">
4. {{ _("Confirm Your Information")}}
</h3>
</div> </div>
<div class="card-body bg-light-subtle me-2">
<div class="card-body bg-light-subtle">
<h5 class="text-center"><i class="fas fa-file-invoice-dollar me-2"></i>{{ _("Order Summary")}}</h5> <h5 class="text-center"><i class="fas fa-file-invoice-dollar me-2"></i>{{ _("Order Summary")}}</h5>
<div class="summary-item"><i class="fas fa-box me-2"></i><strong>{{ _("Plan") }}:</strong> <span id="summary_plan"></span></div> <div class="summary-item"><i class="fas fa-box me-2"></i><strong>{{ _("Plan") }}:</strong> <span id="summary_plan"></span></div>
<div class="summary-item"><i class="fas fa-tag me-2"></i><strong>{{ _("Price") }}:</strong> <span id="summary_price"></span></div> <div class="summary-item"><i class="fas fa-tag me-2"></i><strong>{{ _("Price") }}:</strong> <span id="summary_price"></span></div>

View File

@ -4,8 +4,20 @@
{% block title %}{{ _("Quotations") }}{% endblock title %} {% block title %}{{ _("Quotations") }}{% endblock title %}
{% block content %} {% block content %}
<div class="row mt-4"> <div class="row g-3 mt-4 mb-4">
<h3 class="mb-3"><i class="fa-regular fa-file-lines"></i> {% trans "Quotations" %}</h3>
<div class="row g-3 justify-content-between mb-4">
<div class="col-auto">
<div class="d-md-flex justify-content-between">
<h2 class="mb-3"> {% trans "Quotations" %}<i class="fa-regular fa-file-lines text-primary ms-2"></i></h2>
</div>
</div>
<div class="col-auto">
<div class="d-flex">
{% include 'partials/search_box.html' %}
</div>
</div>
</div>
<div class="table-responsive px-1 scrollbar"> <div class="table-responsive px-1 scrollbar">
<table class="table align-items-center table-flush"> <table class="table align-items-center table-flush">

View File

@ -5,8 +5,19 @@
{% block content %} {% block content %}
<div class="row mt-4"> <div class="row mt-4">
<h3 class="mb-3"><i class="fa-solid fa-receipt"></i> {% trans "Invoices" %}</h3>
<div class="row g-3 justify-content-between mb-4">
<div class="col-auto">
<div class="d-md-flex justify-content-between">
<h2 class="mb-3"> {% trans "Invoices" %}<i class="fa-solid fa-receipt ms-2 text-primary"></i></h2>
</div>
</div>
<div class="col-auto">
<div class="d-flex">
{% include 'partials/search_box.html' %}
</div>
</div>
</div>
<div class="table-responsive px-1 scrollbar"> <div class="table-responsive px-1 scrollbar">
<table class="table align-items-center table-flush"> <table class="table align-items-center table-flush">
<thead> <thead>

View File

@ -3,117 +3,34 @@
{% load custom_filters %} {% load custom_filters %}
{%block title%} {%trans 'Sales'%} {%endblock%} {%block title%} {%trans 'Sales'%} {%endblock%}
{% block customCSS %}
<style>
.htmx-indicator{
opacity:0;
transition: opacity 500ms ease-in;
}
.htmx-request .htmx-indicator{
opacity:1;
}
.htmx-request.htmx-indicator{
opacity:1;
}
.on-before-request{
opacity: 0.5;
pointer-events: none;
}
.transition {
transition: all ease-in 1s ;
}
</style>
{% endblock customCSS %}
{% block content %} {% block content %}
<div class="mb-9"> <section class="mt-2">
<div id="projectSummary"> <div class="row overflow-x-auto whitespace-nowrap -mx-2 sm:mx-0">
<div class="row g-3 justify-content-between align-items-end mb-4">
<div class="col-12 col-sm-auto"> <div class="row g-3 justify-content-between mb-4">
{% comment %} <ul class="nav nav-links mx-n2" hx-boost="true" hx-push-url='false' hx-target=".table-responsive" hx-select=".table-responsive" hx-swap="innerHTML show:window:top" hx-indicator=".htmx-indicator" <div class="col-auto">
hx-on::before-request="on_before_request()" <div class="d-md-flex justify-content-between">
hx-on::after-request="on_after_request()" <h2 class="mb-4">{% trans 'Sale Orders' %}<i class="fa-solid fa-cart-shopping ms-2 text-primary"></i></h2>
> </div>
<li class="nav-item"><a class="nav-link px-2 py-1 active" aria-current="page" href="{% url 'car_list' %}"><span>All</span><span class="text-body-tertiary fw-semibold">({{stats.all}})</span></a></li>
<li class="nav-item"><a class="nav-link px-2 py-1" href="{% url 'car_list' %}?status=available"><span>Available</span><span class="text-body-tertiary fw-semibold">({{stats.available}})</span></a></li>
<li class="nav-item"><a class="nav-link px-2 py-1" href="{% url 'car_list' %}?status=reserved"><span>Reserved</span><span class="text-body-tertiary fw-semibold">({{stats.reserved}})</span></a></li>
<li class="nav-item"><a class="nav-link px-2 py-1" href="{% url 'car_list' %}?status=transfer"><span>Transfer</span><span class="text-body-tertiary fw-semibold">({{stats.transfer}})</span></a></li>
<li class="nav-item"><a class="nav-link px-2 py-1" href="{% url 'car_list' %}?status=sold"><span>Sold</span><span class="text-body-tertiary fw-semibold">({{stats.sold}})</span></a></li>
<li class="nav-item"><button hx-on:click="toggle_filter()" class="nav-link px-2 py-1"><span>Filter</span><span class="text-body-tertiary fw-semibold"></span></button></li>
</ul> {% endcomment %}
</div> </div>
<div class="col-12 col-sm-auto"> <div class="col-auto">
<div class="d-flex align-items-center"> <div class="d-flex">
<div class="spinner-border mx-3 htmx-indicator" role="status"><span class="visually-hidden">Loading...</span></div> {% include 'partials/search_box.html' %}
<div class="search-box me-3">
<form class="position-relative">
<input class="form-control search-input search" name='search' type="search" placeholder="{{ _("Search") }}" aria-label="Search" hx-get="{% url 'car_list' request.dealer.slug %}" hx-trigger='keyup changed delay:500ms' hx-target='.table-responsive' hx-select='.table-responsive' hx-swap="innerHTML show:window:top" hx-indicator=".htmx-indicator"
hx-on::before-request="on_before_request()"
hx-on::after-request="on_after_request()"
/>
<span class="fas fa-search search-box-icon"></span>
</form>
</div>
</div> </div>
</div> </div>
</div> </div>
<div class="d-flex align-items-center d-none filter">
<select hx-get="{% url 'car_list' request.dealer.slug %}" name="make" hx-target='.model-select' hx-select='.model-select' hx-swap="outerHTML show:window:top" hx-indicator=".htmx-indicator" class="form-select make" aria-label="Default select example"
hx-on::before-request="filter_before_request()"
hx-on::after-request="filter_after_request()"
>
<option selected="" value="" disabled>Select Make</option>
{% for m in make %}
<option value="{{ m.pk }}">{{ m.name }}</option>
{% endfor %}
</select>
<select hx-get="{% url 'car_list' request.dealer.slug %}" hx-include=".make" name="model" hx-target='.year' hx-select='.year' hx-swap="outerHTML show:window:top" hx-indicator=".htmx-indicator" class="form-select model-select" aria-label="Default select example"
hx-on::before-request="filter_before_request()"
hx-on::after-request="filter_after_request()"
>
<option selected="" value="" disabled>Select Model</option>
{% for m in model %}
<option value="{{ m.pk }}">{{ m.name }}</option>
{% endfor %}
</select>
<select class="form-select year" name="year" aria-label="Default select example">
<option selected="" value="" disabled>Select Year</option>
{% for y in year %}
<option value="{{ y.0 }}">{{ y.0 }}</option>
{% endfor %}
</select>
<select class="form-select car_status" name="car_status" aria-label="Default select example">
<option selected="" value="">All</option>
<option value="available">Available</option>
<option value="reserved">Reserved</option>
<option value="sold">Sold</option>
<option value="transfer">Transfer</option>
</select>
<button id="search" hx-get="{% url 'car_list' request.dealer.slug %}" hx-include=".make,.model,.year,.car_status" hx-indicator=".htmx-indicator" hx-target='.table-responsive' hx-select='.table-responsive' hx-swap="outerHTML show:window:top" class="btn btn-sm btn-phoenix-primary"
hx-on::before-request="filter_before_request()"
hx-on::after-request="filter_after_request()">Search</button>
</div>
<div class="row">
<div class="table-responsive scrollbar transition">
<div class="d-flex flex-wrap align-items-center justify-content-between py-3 pe-0 fs-9">
<div class="d-flex" hx-boost="true" hx-push-url='false' hx-include=".make,.model,.year,.car_status" hx-target=".table-responsive" hx-select=".table-responsive" hx-swap="innerHTML show:window:top" hx-indicator=".htmx-indicator" <div class="table-responsive scrollbar mx-n1 px-1">
hx-on::before-request="on_before_request()" <table class="table align-items-center table-flush">
hx-on::after-request="on_after_request()">
</div>
<table class="table align-items-center table-flush">
<thead> <thead>
<tr class="bg-body-highlight"> <tr class="bg-body-highlight">
<th class="sort white-space-nowrap align-middle ps-0" scope="col" data-sort="customer_name" style="width:10%;"> <th class="sort white-space-nowrap align-middle ps-0" scope="col" data-sort="customer_name">
{{ _("Customer Name")}}</th> {{ _("Customer Name")}}</th>
<th class="sort align-middle ps-3" scope="col" data-sort="customer_address" style="width:5%;">{{ _("Customer Address")}}</th> <th class="sort align-middle ps-3" scope="col" data-sort="customer_address" >{{ _("Customer Address")}}</th>
<th class="sort align-middle ps-3" scope="col" data-sort="customer_phone" style="width:5%;">{{ _("Customer Phone")}}</th> <th class="sort align-middle ps-3" scope="col" data-sort="customer_phone">{{ _("Customer Phone")}}</th>
<th class="sort align-middle ps-3" scope="col" data-sort="quotation" style="width:7%;">{{ _("Quotation") }}</th> <th class="sort align-middle ps-3" scope="col" data-sort="quotation">{{ _("Quotation") }}</th>
<th class="sort align-middle ps-3" scope="col" data-sort="invoice" style="width:7%;">{{ _("Invoice") }}</th> <th class="sort align-middle ps-3" scope="col" data-sort="invoice" >{{ _("Invoice") }}</th>
<th class="sort align-middle ps-3" scope="col" data-sort="status" style="width:7%;">{{ _("Status") }}</th> <th class="sort align-middle text-end" scope="col" ></th>
<th class="sort align-middle ps-3" scope="col" data-sort="staff" style="width:7%;">{{ _("Staff Member") }}</th>
<th class="sort align-middle text-end" scope="col" style="width:10%;"></th>
</tr> </tr>
</thead> </thead>
<tbody class="list" id="project-list-table-body"> <tbody class="list" id="project-list-table-body">
@ -170,20 +87,7 @@
</p> </p>
{% endif %} {% endif %}
</td> </td>
<td class="align-middle text-end white-space-nowrap pe-4 action">
<td class="align-middle white-space-nowrap text-end status">
{% if car.status == "available" %}
<span class="badge badge-phoenix fs-10 badge-phoenix-success">{{car.status}}</span>
{% elif car.status == "reserved" %}
<span class="badge badge-phoenix fs-10 badge-phoenix-danger">{{car.status}}</span>
{% elif car.status == "sold" %}
<span class="badge badge-phoenix fs-10 badge-phoenix-info">{{car.status}}</span>
{% elif car.status == "transfer" %}
<span class="badge badge-phoenix fs-10 badge-phoenix-warning">{{car.status}}</span>
{% endif %}
</td>
<td class="align-middle white-space-nowrap text-center staff"></td>
<td class="align-middle text-end white-space-nowrap pe-0 action">
<div class="btn-reveal-trigger position-static"> <div class="btn-reveal-trigger position-static">
<button class="btn btn-sm dropdown-toggle dropdown-caret-none transition-none btn-reveal fs-10" type="button" data-bs-toggle="dropdown" data-boundary="window" aria-haspopup="true" aria-expanded="false" data-bs-reference="parent"><span class="fas fa-ellipsis-h fs-10"></span></button> <button class="btn btn-sm dropdown-toggle dropdown-caret-none transition-none btn-reveal fs-10" type="button" data-bs-toggle="dropdown" data-boundary="window" aria-haspopup="true" aria-expanded="false" data-bs-reference="parent"><span class="fas fa-ellipsis-h fs-10"></span></button>
<div class="dropdown-menu dropdown-menu-end py-2"><a class="dropdown-item text-success-dark" href="{% url 'order_detail' request.dealer.slug tx.pk %}">{{ _("View Sales Order Detail") }}</a> <div class="dropdown-menu dropdown-menu-end py-2"><a class="dropdown-item text-success-dark" href="{% url 'order_detail' request.dealer.slug tx.pk %}">{{ _("View Sales Order Detail") }}</a>
@ -194,53 +98,18 @@
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
</div>
</div>
<div class="d-flex justify-content-end mt-3">
<div class="d-flex">
{% if is_paginated %}
{% include 'partials/pagination.html' %}
{% endif %}
</div>
</div>
</div> </div>
{% if page_obj.paginator.num_pages > 1 %}
<div class="d-flex justify-content-end mt-3">
<div class="d-flex">
{% include 'partials/pagination.html'%}
</div>
</div>
{% endif %}
</div> </div>
</div> </section>
{% endblock %} {% endblock %}
{% block customJS %}
<script>
links = document.querySelectorAll('.nav-link')
links.forEach(link => {
link.addEventListener('click', () => {
links.forEach(link => {
link.classList.remove('active')
})
link.classList.add('active')
})
})
function on_before_request() {
document.querySelector('.table').classList.toggle('on-before-request')
document.querySelector('.model-select').classList.add('on-after-request')
}
function on_after_request() {
document.querySelector('.table').classList.remove('on-before-request')
document.querySelector('.model-select').classList.remove('on-after-request')
}
function toggle_filter(){
document.querySelector('.filter').classList.toggle('d-none')
}
function filter_before_request(){
document.querySelector('.model-select').setAttribute('disabled', true)
document.querySelector('.year').setAttribute('disabled', true)
document.querySelector('.car_status').setAttribute('disabled', true)
}
function filter_after_request(){
document.querySelector('.model-select').removeAttribute('disabled')
document.querySelector('.year').removeAttribute('disabled')
document.querySelector('.car_status').removeAttribute('disabled')
}
</script>
{% endblock customJS %}

View File

@ -13,7 +13,7 @@
{% block content %} {% block content %}
<div class="row"> {% comment %} <div class="row">
<div class="row"> <div class="row">
<div class="col-sm-9"> <div class="col-sm-9">
<div class="d-sm-flex justify-content-between"> <div class="d-sm-flex justify-content-between">
@ -55,6 +55,54 @@
</form> </form>
</div> </div>
</div> </div>
</div> </div> {% endcomment %}
<!---->
<div class="row justify-content-center mt-5 mb-3">
<div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center text-white">
<i class="fa-solid fa-user-tie"></i>
{% if staff.created %}
{{ _("Edit Staff") }}
{% else %}
{{ _("Add Staff") }}
{% endif %}
</h3>
</div>
<div class="card-body bg-light-subtle">
<form class="row g-3 mb-9" method="post" class="form" novalidate>
{% csrf_token %}
{{ redirect_field }}
{{ form.name|as_crispy_field }}
{{ form.arabic_name|as_crispy_field }}
{{ form.email|as_crispy_field }}
{{ form.phone_number|as_crispy_field }}
{{ form.address|as_crispy_field }}
{{ form.image|as_crispy_field }}
{{ form.group|as_crispy_field }}
{% for error in form.errors %}
<div class="text-danger">{{ error }}</div>
{% endfor %}
<hr class="my-2">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-lg btn-phoenix-success md-me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
<a href="{{request.META.HTTP_REFERER}}" class="btn btn-lg btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
</div>
</form>
</div>
</div>
</div>
</div>
<!---->
{% endblock %} {% endblock %}