Merge pull request 'Changes in the forms ui and the ui of pricing_plans' (#143) from frontend into main

Reviewed-on: #143
This commit is contained in:
ismail 2025-07-14 17:39:20 +03:00
commit 719f7af485
37 changed files with 945 additions and 563 deletions

3
.gitignore vendored
View File

@ -45,6 +45,9 @@ Makefile
.idea/**/dbnavigator.xml
**/migrations/**
**haikalbot/migrations/**
# Gradle
.idea/**/gradle.xml
.idea/**/libraries

4
.vscode/launch.json vendored
View File

@ -8,13 +8,13 @@
"name": "Python Debugger: Django",
"type": "debugpy",
"request": "launch",
"args": [
"args": [
"runserver",
"0.0.0.0:8000"
],
"django": true,
"autoStartBrowser": false,
"program": "${workspaceFolder}/manage.py"
"program": "C:\\Users\\user\\Desktop\\haikal_projects\\venv\\bin\\activate & ${workspaceFolder}/manage.py"
}
]
}

View File

@ -4,7 +4,7 @@ from django.conf.urls.static import static
from django.conf import settings
from django.conf.urls.i18n import i18n_patterns
from inventory import views
from debug_toolbar.toolbar import debug_toolbar_urls
# from debug_toolbar.toolbar import debug_toolbar_urls
# import debug_toolbar
@ -17,7 +17,7 @@ urlpatterns = [
path("api-auth/", include("rest_framework.urls")),
path("api/", include("api.urls")),
# path('dj-rest-auth/', include('dj_rest_auth.urls')),
] + debug_toolbar_urls()
]# + debug_toolbar_urls()
urlpatterns += i18n_patterns(
path("admin/", admin.site.urls),
path("switch_language/", views.switch_language, name="switch_language"),

Binary file not shown.

View File

@ -2627,7 +2627,7 @@ class SaleOrder(models.Model):
blank=True,
)
comments = models.TextField(blank=True, null=True)
formatted_order_id = models.CharField(max_length=10, unique=True, editable=False)
formatted_order_id = models.CharField(max_length=20, unique=True, editable=False)
# Status and Dates
status = models.CharField(
@ -2957,7 +2957,6 @@ class CustomGroup(models.Model):
"itemmodel",
"invoicemodel",
"vendormodel",
"journalentrymodel",
"purchaseordermodel",
"estimatemodel",

View File

@ -206,7 +206,7 @@ from .tasks import create_accounts_for_make, create_user_dealer, send_email
# djago easy audit log
from easyaudit.models import RequestEvent, CRUDEvent, LoginEvent
from django_q.tasks import async_task
from django.db.models import Prefetch
logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO)
@ -440,8 +440,16 @@ class ManagerDashboard(LoginRequiredMixin, TemplateView):
transfer_cars = models.Car.objects.filter(
dealer=dealer, status=models.CarStatusChoices.TRANSFER
).count()
reserved_percentage = reserved_cars / total_cars * 100
sold_percentage = sold_cars / total_cars * 100
try:
reserved_percentage = reserved_cars / total_cars * 100
except ZeroDivisionError as e:
print(f"error: {e}")
try:
sold_percentage = sold_cars / total_cars * 100
except ZeroDivisionError as e:
print(f"error: {e}")
qs = (
models.Car.objects.values("id_car_make__name")
.annotate(count=Count("id"))
@ -1142,7 +1150,7 @@ class CarListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
def get_queryset(self):
dealer = get_user_type(self.request)
qs = super().get_queryset().prefetch_related("id_car_make", "id_car_model", "id_car_trim","finances","colors")
qs = super().get_queryset()
qs = qs.filter(dealer=dealer)
status = self.request.GET.get("status")
search = self.request.GET.get("search")
@ -1194,193 +1202,8 @@ def inventory_stats_view(request, dealer_slug):
"inventory/inventory_stats.html" template.
:rtype: HttpResponse
"""
# cars = (
# models.Car.objects
# .filter(dealer=request.dealer)
# .select_related(
# "id_car_make",
# "id_car_model",
# "id_car_trim__id_car_serie__id_car_model__id_car_make"
# )
# .only(
# "id",
# "id_car_make__id_car_make",
# "id_car_make__slug",
# "id_car_make__name",
# "id_car_make__arabic_name",
# "id_car_model__id_car_model",
# "id_car_model__slug",
# "id_car_model__name",
# "id_car_model__arabic_name",
# "id_car_trim__id_car_trim",
# "id_car_trim__slug",
# "id_car_trim__name",
# "id_car_trim__id_car_serie__id_car_model__id_car_make",
# "id_car_trim__id_car_serie__id_car_model__id_car_model",
# )
# .order_by('id_car_make', 'id_car_model', 'id_car_trim')
# )
# # Get counts in optimized queries
# total_cars = cars.count()
# reserved_cars = models.CarReservation.objects.filter(
# car__dealer=request.dealer
# ).count()
# # Prefetch related data if needed for additional fields
# cars = cars.prefetch_related(
# Prefetch('colors', queryset=models.CarColors.objects.select_related('exterior', 'interior'))
# )
# # Get distinct makes, models, trims in database-compatible way
# makes = (
# cars.order_by('id_car_make')
# .values_list('id_car_make', flat=True)
# .distinct()
# )
# _models = (
# cars.order_by('id_car_model')
# .values_list('id_car_model', flat=True)
# .distinct()
# )
# trims = (
# cars.order_by('id_car_trim')
# .values_list('id_car_trim', flat=True)
# .distinct()
# )
# # Get counts by make/model/trim
# make_counts = dict(
# cars.values_list('id_car_make')
# .annotate(count=Count('id'))
# .order_by('id_car_make')
# )
# model_counts = dict(
# cars.values_list('id_car_model')
# .annotate(count=Count('id'))
# .order_by('id_car_model')
# )
# trim_counts = dict(
# cars.values_list('id_car_trim')
# .annotate(count=Count('id'))
# .order_by('id_car_trim')
# )
# # Build inventory structure
# inventory = {}
# # Process makes
# make_objects = {
# m.id_car_make: m for m in
# models.CarMake.objects.filter(id_car_make__in=makes)
# .only('id_car_make', 'slug', 'name', 'arabic_name')
# }
# for make_id in makes:
# if not make_id:
# continue
# make_obj = make_objects.get(make_id)
# if not make_obj:
# continue
# inventory[make_id] = {
# "make_id": make_id,
# "slug": make_obj.slug,
# "make_name": make_obj.get_local_name(),
# "total_cars": make_counts.get(make_id, 0),
# "models": {},
# }
# # Process models
# model_objects = {
# m.id_car_model: m for m in
# models.CarModel.objects.filter(id_car_model__in=_models)
# .select_related('id_car_make')
# .only('id_car_model', 'slug', 'name', 'arabic_name', 'id_car_make')
# }
# for model_id in _models:
# if not model_id:
# continue
# model_obj = model_objects.get(model_id)
# if not model_obj:
# continue
# make_id = model_obj.id_car_make.id_car_make
# if make_id not in inventory:
# continue
# inventory[make_id]["models"][model_id] = {
# "model_id": model_id,
# "slug": model_obj.slug,
# "model_name": model_obj.get_local_name(),
# "total_cars": model_counts.get(model_id, 0),
# "trims": {},
# }
# # Process trims
# trim_objects = {
# t.id_car_trim: t for t in
# models.CarTrim.objects.filter(id_car_trim__in=trims)
# .select_related('id_car_serie__id_car_model__id_car_make')
# .only('id_car_trim', 'slug', 'name', 'id_car_serie__id_car_model__id_car_make')
# }
# for trim_id in trims:
# if not trim_id:
# continue
# trim_obj = trim_objects.get(trim_id)
# if not trim_obj:
# continue
# make_id = trim_obj.id_car_serie.id_car_model.id_car_make.id_car_make
# model_id = trim_obj.id_car_serie.id_car_model.id_car_model
# if make_id not in inventory or model_id not in inventory[make_id]["models"]:
# continue
# inventory[make_id]["models"][model_id]["trims"][trim_id] = {
# "trim_id": trim_id,
# "slug": trim_obj.slug,
# "trim_name": trim_obj.name,
# "total_cars": trim_counts.get(trim_id, 0),
# }
# # Convert to final structure
# result = {
# "total_cars": total_cars,
# "reserved_cars": reserved_cars,
# "makes": [
# {
# "make_id": make_data["make_id"],
# "slug": make_data["slug"],
# "make_name": make_data["make_name"],
# "total_cars": make_data["total_cars"],
# "models": [
# {
# "model_id": model_data["model_id"],
# "slug": model_data["slug"],
# "model_name": model_data["model_name"],
# "total_cars": model_data["total_cars"],
# "trims": list(model_data["trims"].values()),
# }
# for model_data in make_data["models"].values()
# if model_data["model_id"] # Skip empty models
# ],
# }
# for make_data in inventory.values()
# if make_data["make_id"] # Skip empty makes
# ],
# }
###############################################
# # Base queryset for cars belonging to the dealer
# Base queryset for cars belonging to the dealer
cars = models.Car.objects.filter(dealer=request.dealer)
# Count for total, reserved, showroom, and unreserved cars
@ -1620,18 +1443,6 @@ class CarDetailView(LoginRequiredMixin, PermissionRequiredMixin, DetailView):
context_object_name = "car"
permission_required = ["inventory.view_car"]
def get_queryset(self):
qs = super().get_queryset()
qs = qs.select_related(
"id_car_make",
"id_car_model",
"id_car_trim",
"colors",
"finances",
"vendor",
"registrations"
)
return qs
class CarFinanceCreateView(LoginRequiredMixin, PermissionRequiredMixin, CreateView):
"""
@ -2716,6 +2527,8 @@ def vendorDetailView(request, dealer_slug,slug):
return render(
request, template_name="vendors/view_vendor.html", context={"vendor": vendor}
)
class VendorCreateView(
@ -4062,7 +3875,7 @@ class BankAccountDetailView(LoginRequiredMixin, PermissionRequiredMixin, DetailV
template_name = "ledger/bank_accounts/bank_account_detail.html"
context_object_name = "bank_account"
permission_required = ["django_ledger.view_bankaccountmodel"]
def get_queryset(self):
dealer = get_object_or_404(models.Dealer, slug=self.kwargs["dealer_slug"])
query=self.request.GET.get('q')
@ -5570,6 +5383,7 @@ def PaymentCreateView(request, dealer_slug, pk):
model = invoice if invoice else bill
entity = dealer.entity
form = forms.PaymentForm()
breakpoint()
if request.method == "POST":
form = forms.PaymentForm(request.POST)
@ -5826,8 +5640,7 @@ class LeadListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
def get_queryset(self):
dealer = get_object_or_404(models.Dealer, slug=self.kwargs["dealer_slug"])
query = self.request.GET.get("q")
qs = models.Lead.objects.select_related("staff","id_car_make","id_car_model","customer").filter(dealer=dealer).exclude(status="converted")
qs = models.Lead.objects.filter(dealer=dealer).exclude(status="converted")
if query:
qs = qs.filter(Q(first_name__icontains=query)
| Q(last_name__icontains=query)
@ -5843,7 +5656,8 @@ class LeadListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
if self.request.is_staff:
return qs.filter(staff=self.request.staff)
return models.Lead.objects.none()
class LeadDetailView(LoginRequiredMixin, PermissionRequiredMixin, DetailView):
"""
@ -6909,9 +6723,9 @@ class OpportunityListView(LoginRequiredMixin,PermissionRequiredMixin, ListView):
Q(customer__first_name__icontains=search)
| Q(customer__last_name__icontains=search)
| Q(customer__email__icontains=search)
)
# Stage filter
stage = self.request.GET.get("stage")
@ -7330,7 +7144,7 @@ class ItemExpenseListView(LoginRequiredMixin, PermissionRequiredMixin, ListView)
# def get_queryset(self):
# dealer = get_user_type(self.request)
# return dealer.entity.get_items_expenses()
def get_queryset(self):
dealer = get_user_type(self.request)
query=self.request.GET.get('q')
@ -8911,7 +8725,7 @@ class LedgerModelListView(LoginRequiredMixin,PermissionRequiredMixin, ListView,
show_visible = False
allow_empty = True
paginate_by = 30
permission_required = "django_ledger.view_ledgermodel"
def get_queryset(self):
qs = super().get_queryset()
@ -9228,7 +9042,7 @@ class JournalEntryModelTXSDetailView(JournalEntryModelTXSDetailViewBase):
"""
template_name = "ledger/journal_entry/journal_entry_txs.html"
@login_required
@permission_required("django_ledger.change_ledgermodel", raise_exception=True)
@ -10204,9 +10018,9 @@ class PurchaseOrderListView(LoginRequiredMixin, PermissionRequiredMixin, ListVie
if query:
qs=apply_search_filters(qs,query)
return qs
# def get_queryset(self):
# dealer = get_user_type(self.request)
# entity = dealer.entity
@ -10340,28 +10154,11 @@ class BillModelActionMarkAsInReviewView(BaseBillActionView):
class BillModelActionMarkAsApprovedView(BaseBillActionView):
action_name = "mark_as_approved"
def get_redirect_url(self, dealer_slug, entity_slug, bill_pk, *args, **kwargs):
if self.request.is_manager:
messages.add_message(
self.request,
message="Bill updated successfully.",
level=messages.SUCCESS,
)
return reverse("home",kwargs={"dealer_slug": dealer_slug})
return reverse(
"bill-update",
kwargs={
"dealer_slug": dealer_slug,
"entity_slug": entity_slug,
"bill_pk": bill_pk,
},
)
class BillModelActionMarkAsPaidView(BaseBillActionView):
action_name = "mark_as_paid"
class BillModelActionDeleteView(BaseBillActionView):
action_name = "mark_as_delete"

View File

@ -5,7 +5,7 @@
{% load crispy_forms_filters %}
{% block content %}
<div class="row justify-content-center">
{% comment %} <div class="row justify-content-center">
<div class="col-lg-6">
<div class="card shadow-sm">
<div class="card-header bg-light py-3">
@ -46,5 +46,63 @@
</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 'Create Bill' %}
</h3>
</div>
<div class="card-body bg-light-subtle">
<form action="{{ form_action_url }}" method="post" id="djl-bill-model-create-form-id">
<div class="card-body">
{% csrf_token %}
{% if po_model %}
<div class="text-center mb-4">
<h3 class="h5">{% trans 'Bill for' %} {{ po_model.po_number }}</h3>
<p class="text-muted mb-3">{% trans 'Bill for' %} {{ po_model.po_title }}</p>
<div class="d-flex flex-column gap-2">
{% for itemtxs in po_itemtxs_qs %}
<span class="badge bg-secondary">{{ itemtxs }}</span>
{% endfor %}
</div>
</div>
{% endif %}
<div class="mb-4">
{{ form|crispy }}
</div>
</div>
<div class="card-footer bg-transparent">
<div class="d-grid gap-2">
<button type="submit"
id="djl-bill-create-button"
class="btn btn-phoenix-primary btn-lg">{% trans 'Create' %}
</button>
<a href="{{request.META.HTTP_REFERER}}"
id="djl-bill-create-back-button"
class="btn btn-phoenix-secondary">{% trans 'Cancel' %}</a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
<!---->
{% endblock %}

View File

@ -44,12 +44,7 @@
<div class="card shadow-sm">
<div class="card-body">
{% include 'bill/includes/card_bill.html' with dealer_slug=request.dealer.slug bill=bill entity_slug=view.kwargs.entity_slug style='bill-detail' %}
<div class="d-grid mt-4">
<a href="{% url 'bill_list' request.dealer.slug %}" class="btn btn-phoenix-primary">
<i class="fas fa-arrow-left me-1"></i> {% trans 'Bill List' %}
</a>
</div>
</div>
</div>
</div>

View File

@ -17,11 +17,7 @@
<div class="card mb-2">
<div class="card-body">
{% include 'bill/includes/card_bill.html' with dealer_slug=request.dealer.slug bill=bill_model style='bill-detail' entity_slug=view.kwargs.entity_slug %}
<a href="{% url 'bill-detail' dealer_slug=request.dealer.slug entity_slug=view.kwargs.entity_slug bill_pk=bill_model.uuid %}"
class="btn btn-phoenix-secondary w-100 mb-2">
<i class="fas fa-arrow-left me-2"></i>{% trans 'Back to Bill Detail' %}
</a>
<form action="{% url 'bill-update' dealer_slug=request.dealer.slug entity_slug=view.kwargs.entity_slug bill_pk=bill_model.uuid %}" method="post">
{% csrf_token %}
@ -29,18 +25,21 @@
{{ form|crispy }}
</div>
<button type="submit" class="btn btn-phoenix-primary w-100 mb-2">
<button type="submit" class="btn btn-phoenix-primary mb-2 me-2">
<i class="fas fa-save me-2"></i>{% trans 'Save Bill' %}
</button>
<a href="{% url 'bill-detail' dealer_slug=request.dealer.slug entity_slug=view.kwargs.entity_slug bill_pk=bill_model.uuid %}"
class="btn btn-phoenix-secondary mb-2">
<i class="fas fa-arrow-left me-2"></i>{% trans 'Back to Bill Detail' %}
</a>
</form>
<a href="{% url 'bill_list' request.dealer.slug %}"
class="btn btn-phoenix-info w-100 mb-2">
<i class="fas fa-list me-2"></i>{% trans 'Bill List' %}
</a>
</div>
</div>
</div>
</div>
</div>

View File

@ -1,20 +1,22 @@
{% load django_ledger %}
{% load i18n %}
<div id="djl-bill-card-widget" class="">
{% if not create_bill %}
{% if style == 'dashboard' %}
<!-- Dashboard Style Card -->
<div class="">
<div class="card-body ">
<div class="d-flex justify-content-between align-items-center mb-3">
<h6 class="text-uppercase text-secondary mb-0">
<div class="card-body">
<div class="d-flex justify-content-between align-items-center mb-3 text-primary">
<h6 class="text-uppercase text-primary mb-0">
<i class="fas fa-file-invoice me-2"></i>{% trans 'Bill' %}
</h6>
<span class="badge bg-{{ bill.get_status_badge_color }}">{{ bill.get_bill_status_display }}</span>
<span class="badge bg-{{ bill.get_status_badge_color }}">{{ bill.get_bill_status_display }}</span>
</div>
<h4 class="card-title">{{ bill.vendor.vendor_name }}</h4>
<p class="text-sm text-muted mb-4">{{ bill.vendor.address_1 }}</p>
{% if not bill.is_past_due %}
<p class="text-info mb-2">
<i class="fas fa-clock me-2"></i>{% trans 'Due in' %}: {{ bill.date_due | timeuntil }}
@ -91,12 +93,20 @@
<!-- Detail Style Card -->
<div class="">
<div class="card-header p-2 bg-{{ bill.get_status_badge_color }}">
<div class="d-flex align-items-center">
<i class="fas fa-file-invoice me-3 text-white"></i>
<h2 class="mb-0 text-white">
<div class="d-flex align-items-center justify-content-center mb-2 text-primary">
<i class="fas fa-file-invoice me-3 "></i>
<h4 class="mb-0 text-primary me-2">
{% trans 'Bill' %} {{ bill.bill_number }}
</h2>
</h4>
</div>
<a href="{% url 'bill_list' request.dealer.slug %}"
class="btn btn-phoenix-primary mb-2">
<i class="fas fa-long-arrow-alt-left me-2"></i>{% trans 'Back to Bill List' %}
</a>
</div>
<div class="card-body p-2 text-center">
{% if bill.is_draft %}
@ -287,6 +297,7 @@
<!-- Create Bill Card -->
{% if perms.django_ledger.add_billmodel%}
<div class=" bg-light">
<div class="card-body text-center p-5">
<a href="{% url 'django_ledger:bill-create' entity_slug=entity_slug %}"
class="text-primary">

View File

@ -3,15 +3,7 @@
{% if style == 'card_1' %}
<div class="card h-100" style="height: 25rem;">
<div class="card-header">
<h5 class="card-title fs-3 fw-light mb-0">
{% if title %}
{{ title }}
{% else %}
{% trans 'Notes' %}
{% endif %}
</h5>
</div>
<div class="card-body overflow-auto">
{% if notes_html %}
{{ notes_html|safe }}

View File

@ -1,13 +1,14 @@
{% extends 'base.html' %}
{% load i18n static crispy_forms_filters %}
{% block title %}
{# Check if an 'object' exists in the context #}
{% if object %}
{% trans 'Update Lead'%}
{% trans 'Update Lead' %}
{% else %}
{% trans 'Add New Lead'%}
{% trans 'Add New Lead' %}
{% endif %}
{% endblock %}
{% block customcss %}
<style>
.htmx-indicator{
@ -17,49 +18,68 @@
.htmx-request .htmx-indicator{
opacity:1;
}
.htmx-request.htmx-indicator{
.htmx-request.htmx-indicator{ /* For elements with htmx-indicator itself becoming the target */
opacity:1;
}
/* Style for the inline spinner if needed */
.inline-spinner {
width: 1.5rem; /* Adjust size */
height: 1.5rem; /* Adjust size */
vertical-align: middle;
margin-left: 0.5rem; /* Space from the field */
}
</style>
{% endblock customcss %}
{% block content %}
<div class="container-fluid">
<h1>{% if object %}{{ _("Update Lead") }}{% else %}{{ _("Create New Lead") }}{% endif %}</h1>
<div class="row mb-3">
<div class="col-sm-6 col-md-8">
<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-300 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center">
{% if object %}
{{ _("Update Lead") }}
{% else %}
{{ _("Create New Lead") }}
{% endif %}
</h3>
</div>
<div class="card-body bg-light-subtle">
<form class="form" method="post">
{% csrf_token %}
{{ form|crispy }}
<form class="form" method="post">
{% csrf_token %}
{{ form|crispy }}
<div class="d-flex justify-content-start">
<button class="btn btn-sm btn-phoenix-success me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>
<!--<i class="bi bi-save"></i> -->
{{ _("Save") }}
</button>
<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>
</form>
<hr class="my-2">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-phoenix-success btn-lg me-md-2" type="submit">
<i class="fa-solid fa-floppy-disk me-1"></i>
{{ _("Save") }}
</button>
<a href="{{ request.META.HTTP_REFERER }}" class="btn btn-phoenix-danger btn-lg">
<i class="fa-solid fa-ban me-1"></i>
{% trans "Cancel" %}
</a>
</div>
</form>
</div>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
// First, create the spinner div (or use the existing one)
const spinner = document.createElement('div');
spinner.id = 'spinner';
spinner.className = 'htmx-indicator spinner-border inline-spinner';
spinner.setAttribute('role', 'status');
spinner.className = 'htmx-indicator spinner-border text-primary inline-spinner';
spinner.innerHTML = '<span class="visually-hidden">Loading...</span>';
const targetFieldDiv = document.getElementById('div_id_id_car_model');
// Find the form field you want to place it next to
// Replace 'id_your_field_name' with the actual ID of your form field
const targetField = document.getElementById('div_id_id_car_model');
if (targetField) {
// Insert the spinner right after the target field
targetField.parentNode.insertBefore(spinner, targetField.nextSibling);
if (targetFieldDiv) {
targetFieldDiv.parentNode.insertBefore(spinner, targetFieldDiv.nextSibling);
}
});
</script>

View File

@ -4,7 +4,7 @@
{% block content %}
<div class="row g-3 mt-4 mb-4">
<h2 class="mb-2">{{ _("Leads")|capfirst }}</h2>
<h2 class="mb-2">{{ _("Leads")|capfirst }}<li class="fas fa-bullhorn text-primary ms-2"></li></h2>
<!-- Action Tracking Modal -->
{% include "crm/leads/partials/update_action.html" %}

View File

@ -68,7 +68,7 @@
<div class="row justify-content-center">
<div class="col">
<div class="d-flex justify-content-between mb-3">
<h3>{{ _("Lead Tracking")}}</h3>
<h3>{{ _("Lead Tracking")}}<li class="fas fa-bullhorn text-primary ms-2"></li></h3>
</div>
<div class="row g-3">

View File

@ -5,7 +5,7 @@
{% block content %}
<div class="row g-3 mt-4">
<div class="col-12">
<h2 class="mb-3">{{ _("Opportunities") }}</h2>
<h2 class="mb-3">{{ _("Opportunities") }} <li class="fas fas fa-rocket text-primary ms-2"></li></h2>
</div>
<div class="col-12">
<div class="d-flex flex-column flex-md-row justify-content-between align-items-md-center gap-3 mb-4">

View File

@ -9,38 +9,38 @@
{% trans 'Add New Customer'%}
{% endif %}
{% endblock %}
{% block content %}
<link rel="stylesheet" href="{% static 'flags/sprite.css' %}">
<div class="row">
<div class="row mb-3">
<div class="col-sm-6 col-md-8">
<div class="d-sm-flex justify-content-between">
<h3 class="mb-3">
<div class="row justify-content-center mt-5 mb-3">
<div class="col-lg-8 col-md-10">
<div class="card shadow-sm border-o rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center">
{% if customer.created %}
<i class="fa-solid fa-user"></i> {{ _("Edit Customer") }}
{% else %}
<i class="fa-solid fa-user"></i> {{ _("Add Customer") }}
{% endif %}
</h3>
</div>
</div>
</div>
<div class="row mb-3">
<div class="col-sm-6 col-md-8">
<div class="card-body bg-light-subtle">
<form method="post" class="form row g-3 needs-validation" enctype="multipart/form-data" novalidate>
{% csrf_token %}
{{ form|crispy }}
<div class="col-12">
<button class="btn btn-sm btn-phoenix-success me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>
<!--<i class="bi bi-save"></i> -->
{{ _("Save") }}
</button>
<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>
</form>
</div>
</div>
</div>
{% endblock %}
<hr class="my-2">
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button class="btn btn-phoenix-success btn-lg me-md-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>
{%endblock %}

View File

@ -6,7 +6,7 @@
{% block content %}
<div class="row g-3 mt-4">
<h2 class="mb-2">{{ _("Customers")|capfirst }}</h2>
<h2 class="mb-2">{{ _("Customers")|capfirst }} <li class="fas fa-people-group text-primary ms-2"></li></h2>
<div class="row g-3 justify-content-between mb-4">
<div class="col-auto">
<div class="d-md-flex justify-content-between">

View File

@ -28,16 +28,27 @@
aria-label="Close"></button>
</div>
{% endif %}
<div class="container-fluid m-0 {% if not vendor_exists %}disabled{% endif %}">
<form method="post" id="carForm" class="form needs-validation" novalidate>
{% csrf_token %}
{% include 'partials/form_errors.html' %}
<!---->
<div class="row justify-content-center mt-5 mb-3 {% if not vendor_exists %}disabled{% endif %}">
<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">
<h3 class="mb-3">{% trans 'Add Car' %} <li class="fas fa-car-on text-primary ms-2"></li></h3>
</h3>
</div>
<div class="card-body bg-light-subtle">
<form method="post" id="carForm" class="form needs-validation" novalidate>
{% csrf_token %}
{% include 'partials/form_errors.html' %}
<div class="d-flex flex-column">
<div class="d-flex flex-column flex-sm-grow-1 p-0">
<div class="row g-4">
<h3 class="mb-3">{% trans 'Add Car' %}</h3>
<!-- VIN Section -->
<div class="col-lg-12 col-xl-6">
<div class="col-lg-12 ">
<div class="card bg-body mb-3 shadow-sm">
<div class="card-body">
<!-- Improved VIN input with integrated buttons -->
@ -144,7 +155,7 @@
</div>
</div>
<div class="row g-3">
<div class="col-xl-6">
<div class="col-lg-12">
<div class="row">
<!--Vendor Field-->
<div class="col-lg-4 col-xl-4">
@ -202,28 +213,39 @@
</div>
</div>
</div>
<!--Save Buttons-->
<div class="btn-group mt-3">
<button type="submit"
<hr class="my-2">
<!--Save Buttons-->
<div class="d-grid gap-2 d-md-flex justify-content-md-center mt-3">
<button type="submit"
name="add_another"
value="true"
class="btn btn-phoenix-success me-1">
class="btn btn-lg btn-phoenix-success md-me-2">
{% trans "Save and Add Another" %}
</button>
<button type="submit"
name="go_to_stats"
value="true"
class="btn btn-phoenix-primary">
class="btn btn-lg btn-phoenix-primary">
{% trans "Save and Go to Inventory" %}
</button>
</div>
</div>
</div>
</div>
</div>
</div>
</form>
</form>
<!-- Modal sections remain largely unchanged -->
</div>
</div>
<!-- Modal sections remain largely unchanged -->
<!--Specification Modal-->
<div class="modal fade"
id="specificationsModal"
@ -312,7 +334,11 @@
</div>
</div>
</div>
</div>
</div>
</div>
<!---->
<script>
function getCookie(name) {
let cookieValue = null;

View File

@ -28,7 +28,7 @@
<div class="container-fluid" id="projectSummary">
<div class="row g-3 justify-content-between align-items-end mb-4">
<div class="col-12 col-sm-auto">
<h2 class="text-body-emphasis fw-bold mb-0">{{ _("Inventory") }}</h2>
<h2 class="text-body-emphasis fw-bold mb-0">{{ _("Inventory") }}<li class="fas fa-store text-primary ms-2"></li></h2>
</div>
</div>
<div class="row g-3 justify-content-between align-items-end mb-2">

View File

@ -4,7 +4,7 @@
{% load i18n %}
{% block title %}{{ _("Add New Expense") }}{% endblock title %}
{% block content %}
<div class="row">
{% comment %} <div class="row">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
@ -13,9 +13,7 @@
<form method="post" action="">
{% csrf_token %}
{{ form|crispy }}
<!--<button type="submit" class="btn btn-primary">{% trans 'Save' %}</button> -->
{% comment %} <button class="btn btn-sm btn-success me-1" type="submit"><i class="fa-solid fa-floppy-disk"></i>{{ _("Save") }}</button> {% endcomment %}
<div class="d-flex justify-content-start">
<button class="btn btn-sm btn-phoenix-success 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-sm btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
@ -26,6 +24,43 @@
</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">
{{ _("Add Expense") }}
</h3>
</div>
<div class="card-body bg-light-subtle">
<form method="post" action="">
{% 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 content %}

View File

@ -4,7 +4,7 @@
{% load i18n %}
{% block title %}{{ _("Update Expense") }}{% endblock title %}
{% block content %}
<div class="row">
{% comment %} <div class="row">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
@ -19,6 +19,40 @@
</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">
{{ _("Update Expense") }}
</h3>
</div>
<div class="card-body bg-light-subtle">
<form method="post" action="">
{% 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 content %}

View File

@ -13,7 +13,7 @@
{% endblock %}
{% block content %}
<div class="container">
{% comment %} <div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card bg-body">
@ -38,6 +38,45 @@
</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 service.pk %}
{{ _("Update Service") }}
{% else %}
{{ _("Add Service") }}
{% endif %}
</h3>
</div>
<div class="card-body bg-light-subtle">
<form method="post" action="">
{% 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 content %}

View File

@ -12,7 +12,8 @@
{% block content %}
<div class="container">
{% comment %} <div class="container">
<div class="row justify-content-center">
<div class="col-8">
<div class="card shadow rounded bg-body">
@ -46,5 +47,48 @@
</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 customer.created %}
{{ _("Edit Bank Account") }}
{% else %}
{{ _("Add Bank Account") }}
{% endif %}
</h3>
</div>
<div class="card-body bg-light-subtle">
<form method="post" class="form" novalidate>
{% csrf_token %}
{{ 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 %}

View File

@ -12,6 +12,7 @@
{% endblock %}
{% block content %}
{% comment %}
<div class="row my-5">
<!-- Display Form Errors -->
<div class="card shadow rounded bg-body">
@ -46,5 +47,46 @@
</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">
{% if account.created %}
<i class="fa-solid fa-book"></i> {{ _("Edit Account") }}
{% else %}
<i class="fa-solid fa-book"></i> {{ _("Add Account") }}
{% endif %}
</h3>
</div>
<div class="card-body bg-light-subtle">
<form method="post" class="form" novalidate>
{% csrf_token %}
{{ 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 %}

View File

@ -5,7 +5,7 @@
{% block title %}{{ _("Create Journal Entry") }}{% endblock title %}
{% block content %}
<div class="row mt-4">
{% comment %} <div class="row mt-4">
<h3 class="text-center">{% trans "Create Journal Entry" %}</h3>
<form id="mainForm" method="post" class="needs-validation">
{% csrf_token %}
@ -17,5 +17,40 @@
<a href="{% url 'journalentry_list' request.dealer.slug ledger.pk %}" class="btn btn-phoenix-secondary"><i class="fa-solid fa-ban me-1"></i> {% trans "Cancel" %}</a>
</div>
</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 "Create Journal Entry" %}
</h3>
</div>
<div class="card-body bg-light-subtle">
<form id="mainForm" method="post" class="needs-validation">
{% csrf_token %}
<div class="row g-3">
{{ form|crispy }}
</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="{% url 'journalentry_list' request.dealer.slug ledger.pk %}" class="btn btn-lg btn-phoenix-secondary"><i class="fa-solid fa-ban me-1"></i> {% trans "Cancel" %}</a>
</div>
</form>
</div>
</div>
</div>
</div>
<!---->
{% endblock content %}

View File

@ -5,17 +5,13 @@
{% block title %}{{ _("Create Ledger") }}{% endblock title %}
{% block content %}
<div class="row mt-4">
{% comment %} <div class="row mt-4">
<h3 class="text-center">{% trans "Create Ledger" %}</h3>
<form id="mainForm" method="post" class="needs-validation">
{% csrf_token %}
<div class="row g-3">
{{ form|crispy }}
</div>
{% comment %} <div class="mt-5 text-center">
<button type="submit" class="btn btn-success me-2"><i class="fa-solid fa-floppy-disk"></i>{% trans "Save" %}</button>
<a href="{% url 'ledger_list' %}" class="btn btn-danger"><i class="fa-solid fa-ban"></i> {% trans "Cancel" %}</a>
</div> {% endcomment %}
<div class="d-flex justify-content-center">
<button class="btn btn-sm btn-phoenix-success me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>{{ _("Save") }}</button>
@ -24,5 +20,44 @@
</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 "Create Ledger" %}
</h3>
</div>
<div class="card-body bg-light-subtle">
<form id="mainForm" method="post" class="needs-validation">
{% csrf_token %}
<div class="row g-3">
{{ form|crispy }}
</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>
<!---->
{% endblock content %}

View File

@ -9,29 +9,45 @@
{% trans 'Add New Organization'%}
{% endif %}
{% endblock %}
{% block content %}
<div class="container-fluid mt-4">
<!--Heading-->
<h3 class="mb-3">
{% if object %}
{% trans 'Update Organization'%}
{% else %}
{% trans 'Add New Organization'%}
{% endif %}
</h3>
<!--form body-->
<div class="row justify-content-center mt-5 mb-3">
<div class="row mb-3">
<div class="col-sm-6 col-md-8">
<form class="form" method="post" enctype="multipart/form-data">
<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 object %}
{% trans 'Update Organization'%}
{% else %}
{% trans 'Add New Organization'%}
{% endif %}
</h3>
</div>
<div class="card-body bg-light-subtle">
<form class="form" method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ redirect_field }}
{{ form|crispy }}
<button class="btn btn-sm btn-phoenix-success 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-sm btn-phoenix-danger"><i class="fa-solid fa-ban me-1"></i>{% trans "Cancel" %}</a>
<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>
{% endblock %}
</div>
</div>
{% endblock%}

View File

@ -11,7 +11,7 @@
{% block content %}
<section class="pt-5 pb-9 ">
<div class="row overflow-x-auto whitespace-nowrap -mx-2 sm:mx-0">
<h2 class="mb-4">{% trans 'Organizations' %}</h2>
<h2 class="mb-4">{% trans 'Organizations' %} <li class="fas fa-city text-primary ms-2"></li></h2>
<div class="row g-3 justify-content-between mb-4">
<div class="col-auto">

View File

@ -1,7 +1,7 @@
<div class="search-box me-2">
<form class="position-relative show" id="search-form">
<input name="q" id="search-input" class="form-control form-control-sm search-input search" type="search"
aria-label="Search" placeholder="{{ _('Search') }}" value="{{ request.GET.q }}" />
aria-label="Search" placeholder="{{ _('Search...') }}" value="{{ request.GET.q }}" />
<span class="fa fa-magnifying-glass search-box-icon"></span>
{% if request.GET.q %}
<button type="button" class="btn-close position-absolute end-0 top-50 translate-middle cursor-pointer shadow-none"

View File

@ -12,13 +12,13 @@
}
.pricing-card .card.selected {
border-color: #0d6efd;
border-color:rgb(20, 108, 241);
box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.4);
}
.btn-check:checked + .btn .card {
/* fallback if JS fails */
border-color: #0d6efd;
border-color:rgb(13, 91, 207);
box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25);
}
@ -50,29 +50,37 @@
{% block content %}
<div class="container py-5">
<h1 class="text-center mb-5">{{ _("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">
{% csrf_token %}
<!-- Step 1: Plan Selection -->
<div class="step" id="step1">
<h4 class="mb-4">1. {{ _("Select a Plan")}}</h4>
<div class="row g-4">
{% for pp in plan_list %}
<div class="col-md-6 col-lg-3">
<!--step1: Choose Plans-->
<div class="step row justify-content-center mt-5 mb-3" id="step1">
<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">
<h4 class="mb-0 fs-4 text-center text-white">
1. {{ _("Select a Plan")}}
</h4>
</div>
<div class="card-body bg-light-subtle">
{% for pp in plan_list %}
<div class="col-md-12 mb-3">
<input type="radio" class="btn-check" name="selected_plan" id="plan_{{ forloop.counter }}" value="{{ pp.id }}"
data-name="{{ pp.plan.name }}" data-price="{{ pp.price }}" autocomplete="off" {% if forloop.first %}checked{% endif %}>
<label class="btn w-100 p-0 pricing-card" for="plan_{{ forloop.counter }}">
<div class="card h-100 border border-2 rounded-4">
<div class="card-body p-4">
<h4 class="mb-3">{{ pp.plan.name }}</h4>
<h4 class="mb-3">{{ pp.plan.name|capfirst }}</h4>
<h5 class="mb-4">{{ pp.price }} <span class="icon-saudi_riyal"></span><span class="fs-6 fw-normal">/ {{ pp.pricing.period }}</span> {% trans "days" %}</h5>
<h6>{{ _("Included") }}</h6>
<h5>{{_("Include Haikal's")}}</h5>
<ul class="fa-ul ps-3">
{% if pp.plan.description %}
{% for line in pp.plan.description|splitlines %}
<li class="mb-2">
<span class="fa-li"><i class="fas fa-check text-primary"></i></span>
{{ line }}
{{ line|capfirst}}
</li>
{% endfor %}
{% endif %}
@ -82,124 +90,156 @@
</label>
</div>
{% endfor %}
</div>
</div>
</div>
<!-- Step 2: User Info -->
<div class="step d-none" id="step2">
<h4 class="mb-4">2. {{ _("Enter Your Information")}}</h4>
<div class="row g-3">
<div class="col-md-6">
<label class="form-label" for="first_name">{{ _("First Name")}}</label>
<div class="input-group">
<span class="input-group-text"><i class="fas fa-user"></i></span>
<input type="text" name="first_name" id="first_name" class="form-control form-control-sm" required placeholder="{{ _("First Name")}}" value="{{ request.user.first_name }}">
</div>
</div>
<!--step2: Information-->
<div class="step d-none row justify-content-center mt-5 mb-3" id="step2">
<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">
2. {{ _("Enter Your Information")}}
</h3>
</div>
</div>
<div class="col-md-6">
<label class="form-label" for="last_name">{{ _("Last Name")}}</label>
<div class="input-group">
<span class="input-group-text"><i class="fas fa-user"></i></span>
<input type="text" name="last_name" id="last_name" class="form-control form-control-sm" required placeholder="{{ _("Last Name")}}" value="{{ request.user.last_name }}">
<div class="card-body bg-light-subtle">
<label class="form-label" for="first_name">{{ _("First Name")}}</label>
<div class="input-group">
<span class="input-group-text"><i class="fas fa-user"></i></span>
<input type="text" name="first_name" id="first_name" class="form-control form-control-sm" required placeholder="{{ _("First Name")}}" value="{{ request.user.first_name }}">
</div>
<label class="form-label" for="last_name">{{ _("Last Name")}}</label>
<div class="input-group">
<span class="input-group-text"><i class="fas fa-user"></i></span>
<input type="text" name="last_name" id="last_name" class="form-control form-control-sm" required placeholder="{{ _("Last Name")}}" value="{{ request.user.last_name }}">
</div>
<label class="form-label" for="email">{{ _("Email Address")}}</label>
<div class="input-group">
<span class="input-group-text"><i class="fas fa-envelope"></i></span>
<input type="email" name="email" id="email" class="form-control form-control-sm" required placeholder="email@example.com" value="{{ request.user.email }}">
</div>
<label class="form-label" for="phone">{{ _("Phone Number")}}</label>
<div class="input-group">
<span class="input-group-text"><i class="fas fa-phone"></i></span>
<input type="text" name="phone" id="phone" class="form-control form-control-sm" dir="ltr" placeholder="{{ _("Phone Number")}}" value="{{ request.dealer.phone_number.raw_input }}" required>
</div>
<label class="form-label" for="company">{{ _("Company") }}</label>
<div class="input-group">
<span class="input-group-text"><i class="fas fa-building"></i></span>
<input type="text" name="company" id="company" class="form-control form-control-sm" placeholder="{{ _("Company") }}" value="{{ request.dealer.get_local_name }}">
</div>
</div>
</div>
<div class="col-md-6">
<label class="form-label" for="email">{{ _("Email Address")}}</label>
<div class="input-group">
<span class="input-group-text"><i class="fas fa-envelope"></i></span>
<input type="email" name="email" id="email" class="form-control form-control-sm" required placeholder="email@example.com" value="{{ request.user.email }}">
</div>
</div>
<div class="col-md-6">
<label class="form-label" for="phone">{{ _("Phone Number")}}</label>
<div class="input-group">
<span class="input-group-text"><i class="fas fa-phone"></i></span>
<input type="text" name="phone" id="phone" class="form-control form-control-sm" dir="ltr" placeholder="{{ _("Phone Number")}}" value="{{ request.dealer.phone_number.raw_input }}" required>
</div>
</div>
<div class="col-md-6">
<label class="form-label" for="company">{{ _("Company") }}</label>
<div class="input-group">
<span class="input-group-text"><i class="fas fa-building"></i></span>
<input type="text" name="company" id="company" class="form-control form-control-sm" placeholder="{{ _("Company") }}" value="{{ request.dealer.get_local_name }}">
</div>
</div>
</div>
</div>
<!-- Step 3: Payment -->
<div class="step d-none" id="step3">
<h4 class="mb-4">3. {{ _("Payment Information")}}</h4>
<div class="row g-3">
<div class="col-md-6">
<label class="form-label" for="card_name">{{ _("Cardholder Name")}}</label>
<div class="input-group">
<span class="input-group-text"><i class="fas fa-user"></i></span>
<input type="text" name="card_name" id="card_name" class="form-control form-control-sm" placeholder="{{ _("Cardholder Name")}}" required>
</div>
</div>
<!--step3: Payment-->
<div class="step d-none row justify-content-center mt-5 mb-3" id="step3">
<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">
3. {{ _("Payment Information")}}
</h3>
</div>
</div>
<div class="card-body bg-light-subtle">
<label class="form-label" for="card_name">{{ _("Cardholder Name")}}</label>
<div class="input-group">
<span class="input-group-text"><i class="fas fa-user"></i></span>
<input type="text" name="card_name" id="card_name" class="form-control form-control-sm" placeholder="{{ _("Cardholder Name")}}" required>
</div>
<div class="col-md-6">
<label class="form-label" for="card_number">{{ _("Card Number")}}</label>
<div class="input-group">
<span class="input-group-text"><i class="fas fa-credit-card"></i></span>
<input type="text" name="card_number" id="card_number" class="form-control form-control-sm" placeholder="{{ _("Card Number")}}"
maxlength="19" pattern="^\d{4}\s\d{4}\s\d{4}\s\d{4}$"
inputmode="numeric" required title="Enter a 16-digit card number">
</div>
</div>
<label class="form-label" for="card_number">{{ _("Card Number")}}</label>
<div class="input-group">
<span class="input-group-text"><i class="fas fa-credit-card"></i></span>
<input type="text" name="card_number" id="card_number" class="form-control form-control-sm" placeholder="{{ _("Card Number")}}"
maxlength="19" pattern="^\d{4}\s\d{4}\s\d{4}\s\d{4}$"
inputmode="numeric" required title="Enter a 16-digit card number">
</div>
<div class="col-md-4">
<label class="form-label" for="card_expiry">{{ _("Expiry Date")}} (MM/YY)</label>
<div class="input-group">
<span class="input-group-text"><i class="far fa-calendar-alt"></i></span>
<input type="text" name="card_expiry" id="card_expiry" class="form-control form-control-sm" placeholder="{{ _("Expiry Date")}}"
<label class="form-label" for="card_expiry">{{ _("Expiry Date")}} (MM/YY)</label>
<div class="input-group">
<span class="input-group-text"><i class="far fa-calendar-alt"></i></span>
<input type="text" name="card_expiry" id="card_expiry" class="form-control form-control-sm" placeholder="{{ _("Expiry Date")}}"
maxlength="5" pattern="^(0[1-9]|1[0-2])\/\d{2}$"
inputmode="numeric" required title="Enter expiry in MM/YY format">
</div>
</div>
</div>
<div class="col-md-2">
<label class="form-label" for="card_cvv">{{ _("CVV") }}</label>
<div class="input-group">
<span class="input-group-text"><i class="fas fa-lock"></i></span>
<input type="text" name="card_cvv" id="card_cvv" class="form-control form-control-sm" placeholder="{{ _("CVV") }}"
maxlength="3" pattern="^\d{3}$"
inputmode="numeric" required title="Enter 3-digit CVV">
<label class="form-label" for="card_cvv">{{ _("CVV") }}</label>
<div class="input-group">
<span class="input-group-text"><i class="fas fa-lock"></i></span>
<input type="text" name="card_cvv" id="card_cvv" class="form-control form-control-sm" placeholder="{{ _("CVV") }}"
maxlength="3" pattern="^\d{3}$"
inputmode="numeric" required title="Enter 3-digit CVV">
</div>
</div>
</div>
</div>
</div>
<!-- Step 4: Confirmation -->
<div class="step d-none" id="step4">
<h4 class="mb-4">4. {{ _("Confirm Your Information")}}</h4>
<div class="summary-box">
<h5><i class="fas fa-file-invoice-dollar me-2"></i>{{ _("Order Summary")}}</h5>
<div class="summary-item"><i class="fas fa-box"></i><strong>{{ _("Plan") }}:</strong> <span id="summary_plan"></span></div>
<div class="summary-item"><i class="fas fa-tag"></i><strong>{{ _("Price") }}:</strong> <span id="summary_price"></span></div>
<div class="summary-item"><i class="fas fa-receipt"></i><strong>{{ _("VAT") }} (15%):</strong> <span id="summary-tax">0.00</span> <span class="icon-saudi_riyal"></span></div>
</div>
</div>
<!--Step4 confirmation-->
<div class="step d-none row justify-content-center mt-5 mb-3" id="step4">
<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">
4. {{ _("Confirm Your Information")}}
</div>
<div class="card-body bg-light-subtle me-2">
<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-tag me-2"></i><strong>{{ _("Price") }}:</strong> <span id="summary_price"></span></div>
<div class="summary-item"><i class="fas fa-receipt me-2"></i><strong>{{ _("VAT") }} (15%):</strong> <span id="summary-tax">0.00</span> <span class="icon-saudi_riyal"></span></div>
<div class="summary-item"><i class="fas fa-hand-holding-usd me-2"></i><strong>{{ _("Total") }}:</strong> <span id="summary-total">0.00</span> <span class="icon-saudi_riyal"></span></div>
<hr>
<div class="summary-item"><i class="fas fa-hand-holding-usd"></i><strong>{{ _("Total") }}:</strong> <span id="summary-total">0.00</span> <span class="icon-saudi_riyal"></span></div>
<h5 class="mt-4"><i class="fas fa-user me-2"></i>{{ _("User Information")}}</h5>
<div class="summary-item"><i class="fas fa-signature"></i><strong>{{ _("Name") }}:</strong> <span id="summary_name"></span></div>
<div class="summary-item"><i class="fas fa-envelope"></i><strong>{{ _("Email") }}:</strong> <span id="summary_email"></span></div>
<div class="summary-item"><i class="fas fa-building"></i><strong>{{ _("Company") }}:</strong> <span id="summary_company"></span></div>
<div class="summary-item"><i class="fas fa-phone"></i><strong>{{ _("Phone") }}:</strong> <span id="summary_phone"></span></div>
<h5 class="mt-4 text-center"><i class="fas fa-user me-2"></i>{{ _("User Information")}}</h5>
<div class="summary-item"><i class="fas fa-signature me-2"></i><strong>{{ _("Name") }}:</strong> <span id="summary_name"></span></div>
<div class="summary-item"><i class="fas fa-envelope me-2"></i><strong>{{ _("Email") }}:</strong> <span id="summary_email"></span></div>
<div class="summary-item"><i class="fas fa-building me-2"></i><strong>{{ _("Company") }}:</strong> <span id="summary_company"></span></div>
<div class="summary-item"><i class="fas fa-phone me-2"></i><strong>{{ _("Phone") }}:</strong> <span id="summary_phone"></span></div>
<hr>
<h5 class="mt-4"><i class="fas fa-credit-card me-2"></i>{{ _("Payment") }}</h5>
<div class="summary-item"><i class="fas fa-user"></i><strong>{{ _("Cardholder") }}:</strong> <span id="summary_card_name"></span></div>
<div class="summary-item"><i class="fas fa-credit-card"></i><strong>{{ _("Card Number")}}:</strong> <span id="summary_card_number"></span></div>
<div class="summary-item"><i class="far fa-calendar-alt"></i><strong>{{ _("Expiry") }}:</strong> <span id="summary_card_expiry"></span></div>
<h5 class="mt-4 text-center"><i class="fas fa-credit-card me-2"></i>{{ _("Payment") }}</h5>
<div class="summary-item"><i class="fas fa-user me-2"></i><strong>{{ _("Cardholder") }}:</strong> <span id="summary_card_name"></span></div>
<div class="summary-item"><i class="fas fa-credit-card me-2"></i><strong>{{ _("Card Number")}}:</strong> <span id="summary_card_number"></span></div>
<div class="summary-item"><i class="far fa-calendar-alt me-2"></i><strong>{{ _("Expiry") }}:</strong> <span id="summary_card_expiry"></span></div>
</div>
</div>
</div>
</div>
</div>
<!---->
<!-- Navigation -->
<div class="d-flex justify-content-between mt-4">
<button type="button" class="btn btn-phoenix-secondary" id="prevBtn" disabled>{{ _("Previous") }}</button>
<button type="button" class="btn btn-phoenix-primary" id="nextBtn">{{ _("Next") }}</button>
<button type="submit" class="btn btn-phoenix-success d-none" id="submitBtn">{{ _("Confirm") }}</button>
<button type="button" class="btn btn-lg btn-phoenix-secondary" id="prevBtn" disabled>{{ _("Previous") }}</button>
<button type="button" class="btn btn-lg btn-phoenix-primary" id="nextBtn">{{ _("Next") }}</button>
<button type="submit" class="btn btn-lg btn-phoenix-primary d-none" id="submitBtn">{{ _("Confirm") }}</button>
</div>
</form>
</div>

View File

@ -32,15 +32,26 @@
{% if not create_po %}
{% if style == 'po-detail' %}
<div class="card shadow-sm border-0 mb-2">
<div class="card-header bg-light">
<div class="d-flex align-items-center">
<div class="card-header bg-light ">
<div class="d-flex align-items-center mb-2 ">
<span class="me-3 text-primary">
{% icon 'uil:bill' 36 %}
</span>
<h2 class="h3 mb-0">
<h2 class="h3 mb-0 text-primary me-4">
{{ po_model.po_number }}
</h2>
</div>
<p>
<a class="btn btn-phoenix-primary"
href="{% url 'purchase_order_list' request.dealer.slug request.dealer.entity.slug %}"
title="Click to view the complete list of Purchase Orders"
role="button">
<i class="fas fa-list me-2"></i>{% trans 'PO List' %}
</a>
</p>
</div>
<div class="card-body">
@ -52,6 +63,7 @@
{{ po_model.get_po_status_display }}
</span>
</h3>
</div>
@ -99,14 +111,7 @@
</div>
<div class='col-12 col-md-12 col-lg-2 d-grid align-content-end'>
<a class="btn btn-phoenix-primary py-2"
href="{% url 'purchase_order_list' request.dealer.slug request.dealer.entity.slug %}"
title="Click to view the complete list of Purchase Orders"
role="button">
<i class="fas fa-list me-2"></i>{% trans 'PO List' %}
</a>
</div>
</div>

View File

@ -10,44 +10,42 @@
{% endif %}
{% endblock %}
{% block content %}
<div class="row mt-4">
<div class="row">
<div class="col-xl-9">
<div class="d-sm-flex justify-content-between">
<!---->
<div class="row justify-content-center mt-5 mb-3">
<h3 class="mb-3">
{% if vendor.created %}
<!--<i class="bi bi-pencil-square"></i>-->
{{ _("Edit Purchase Order") }}
{% else %}
<!--<i class="bi bi-person-plus"></i> -->
{{ _("Add New Purchase Order") }}
{% endif %}
</h3>
<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">
{{ _("Add New Purchase Order") }}
</h3>
</div>
<div class="card-body bg-light-subtle">
<form class="row g-3 mb-9" method="post" class="form" enctype="multipart/form-data" 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>
<div class="row">
<div class="col-xl-9">
</div>
<form class="row g-3 mb-9" method="post" class="form" enctype="multipart/form-data" novalidate >
{% csrf_token %}
{{ redirect_field }}
{{ form|crispy }}
{% for error in form.errors %}
<div class="text-danger">{{ error }}</div>
{% endfor %}
<div class="d-flex justify-content-start">
<button class="btn btn-sm btn-phoenix-success me-2" type="submit"><i class="fa-solid fa-floppy-disk me-1"></i>
<!--<i class="bi bi-save"></i> -->
{{ _("Save") }}
</button>
<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>
</div>
</div>
</div>
<!---->
{% endblock %}

View File

@ -13,21 +13,26 @@
<div class="alert alert-success">{{ message }}</div>
{% endfor %}
{% endif %}
<!-- Add New PO Button -->
<div class="d-flex justify-content-between mb-2">
<h3 class="">
{{ _("Purchase Orders") |capfirst }}
<h2 class="">
{{ _("Purchase Orders") |capfirst }} <li class="fas fa-file-invoice text-primary ms-2"></li>
</h2>
{% if perms.django_ledger.add_purchaseordermodel%}
<div>
{% if perms.django_ledger.add_purchaseordermodel %}
<div class="row g-3 justify-content-between mb-4">
<div class="col-auto">
<div class="d-md-flex justify-content-between">
{% if perms.django_ledger.add_purchaseordermodel %}
<a href="{% url 'purchase_order_create' request.dealer.slug request.dealer.entity.slug %}"
class="btn btn-md btn-phoenix-primary"><i class="fa fa-plus me-2"></i>{{ _("Create New PO") }}</a>
{% endif %}
</div>
{% endif %}
{% endif %}
</div>
</div>
{% include "partials/search_box.html" %}
<div class="col-auto">
<div class="d-flex">
{% include 'partials/search_box.html' %}
</div>
</div>
</div>
<div class="table-responsive px-1 scrollbar mt-3">
<table class= "table align-items-center table-flush table-hover">

View File

@ -24,13 +24,11 @@
{% csrf_token %}
{{ form|crispy }}
<button type="submit"
class="btn btn-phoenix-success w-100 my-2">{% trans 'Save PO' %}
class="btn btn-phoenix-success my-2 me-2">{% trans 'Save PO' %}
</button>
<a href="{% url 'purchase_order_detail' request.dealer.slug request.dealer.entity.slug po_model.uuid %}"
class="btn btn-phoenix-secondary w-100 my-2">{% trans 'Back to PO Detail' %}</a>
<a href="{% url 'purchase_order_list' request.dealer.slug request.dealer.entity.slug %}"
class="btn btn-phoenix-info
info w-100 my-2">{% trans 'PO List' %}</a>
class="btn btn-phoenix-secondary my-2">{% trans 'Back to PO Detail' %}</a>
</div>
</div>
</form>

View File

@ -120,8 +120,89 @@
}
</style>
{% endblock customCSS %}
<!---->
{% block content%}
<div class="row justify-content-center mt-5 mb-3">
{% if not items %}
<div class="alert alert-outline-warning d-flex align-items-center" role="alert">
<i class="fa-solid fa-circle-info fs-6"></i>
<p class="mb-0 flex-1">{{ _("Please add at least one car before creating a quotation.") }}<a class="ms-3 text-body-primary fs-9" href="{% url 'car_add' request.dealer.slug %}"> {{ _("Add Car") }} </a></p>
<button class="btn-close" type="button" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
{% endif %}
{% if not customer_count %}
<div class="alert alert-outline-warning d-flex align-items-center" role="alert">
<i class="fa-solid fa-circle-info fs-6"></i>&nbsp;&nbsp;
<p class="mb-0 flex-1"> {{ _("Please add at least one customer before creating a quotation.") }}<a class="ms-3 text-body-primary fs-9" href="{% url 'customer_create' request.dealer.slug %}"> {{ _("Add Customer") }} </a></p>
<button class="btn-close" type="button" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
{% endif %}
<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-regular fa-file-lines"></i> {% trans "Create Quotation" %}
</h3>
</div>
<div class="card-body bg-light-subtle">
<form id="mainForm" method="post" class="needs-validation {% if not items or not customer_count %}disabled{% endif %}">
{% csrf_token %}
<div class="row g-3 col-12">
{{ form|crispy }}
<div class="custom-select">
<!-- Hidden native select for form submission -->
<select class="native-select" name="item" required tabindex="-1">
<option value="">Select a car</option>
{% for item in items %}
<option value="{{ item.hash }}"></option>
{% endfor %}
</select>
<!-- Custom select UI -->
<div class="select-trigger">
<div class="selected-value">
<span>Select a car</span>
</div>
<i class="fas fa-chevron-down dropdown-icon"></i>
</div>
<div class="options-container">
{% for item in items %}
<div class="option" data-value="{{ item.hash }}" data-image="{{item.logo}}">
<img src="{{item.logo}}" alt="{{item.model}}">
<span>{{item.make}} {{item.model}} {{item.serie}} {{item.trim}} {{item.color_name}}</span>
<div class="color-box" style="background-color: rgb({{ item.exterior_color }});"></div>
<div class="color-box" style="background-color: rgb({{ item.interior_color }});"></div>
<span style="color:gray;">({{item.hash_count}} in stock)</span>
</div>
{% endfor %}
</div>
</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>
{% endblock %}
<!---->
{% comment %} {% block content %}
{% block content %}
<div class="row mt-4">
{% if not items %}
<div class="alert alert-outline-warning d-flex align-items-center" role="alert">
@ -184,7 +265,7 @@
</div>
</form>
</div>
{% endblock content %}
{% endblock content %} {% endcomment %}
{% block customJS %}
<script>

View File

@ -4,7 +4,7 @@
{% load i18n %}
{% block title %}{{ _("Invoice") }}{% endblock title %}
{% block content %}
<div class="row paid">
{% comment %} <div class="row paid">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
@ -19,6 +19,42 @@
</div>
</div>
</div>
</div>
</div> {% endcomment %}
<!---->
<div class="row paid 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-receipt"></i> {{ _("Add Invoice") }}
</h3>
</div>
<div class="card-body bg-light-subtle">
<form method="post" action="">
{% 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 content %}

View File

@ -13,7 +13,7 @@
{% block content %}
{% comment %}
<div class="row">
<div class="row">
<div class="col-xl-9">
@ -54,4 +54,43 @@
</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 vendor.created %}
{{ _("Edit Vendor") }}
{% else %}
{{ _("Add Vendor") }}
{% endif %}
</h3>
</div>
<div class="card-body bg-light-subtle">
<form class="row g-3 mb-9" method="post" class="form" enctype="multipart/form-data" 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 %}