haikal/templates/inventory/cars_list_api.html

162 lines
7.4 KiB
HTML

{% extends "base.html" %}
{% load static i18n %}
{% block content %}
<div class="container">
<div id="car_list" data-list="">
<div class="search-box mb-3 mx-auto">
<form class="position-relative">
<input class="form-control search-input search form-control-sm"
type="search"
placeholder="Search"
aria-label="Search" />
<span class="fas fa-search search-box-icon"></span>
</form>
</div>
<div class="row justify-content-end g-0">
<div class="col-auto px-3">
<select class="form-select form-select-sm mb-3"
data-list-filter="data-list-filter">
<option selected="" value="">{{ _("Status") }}</option>
<option value="available">{{ _("Available") }}</option>
<option value="reserved">{{ _("Reserved") }}</option>
<option value="sold">{{ _("Sold") }}</option>
<option value="transfer">{{ _("Transfer") }}</option>
<option value="damaged">{{ _("Damaged") }}</option>
</select>
</div>
</div>
<div class="table-responsive">
<table class="table table-sm fs-9 mb-0">
<thead>
<tr class="bg-body-highlight">
<th class="sort border-top border-translucent ps-1" data-sort="vin">{{ _("VIN") }}</th>
<th class="sort border-top border-translucent" data-sort="make">{{ _("Make") }}</th>
<th class="sort border-top border-translucent" data-sort="model">{{ _("Model") }}</th>
<th class="sort border-top border-translucent" data-sort="status">{{ _("Status") }}</th>
</tr>
</thead>
<tbody class="list">
<tr></tr>
</tbody>
</table>
</div>
<div class="d-flex justify-content-between mt-3">
<span class="d-none d-sm-inline-block fs-9 fw-bold"
data-list-info="data-list-info"><span class="text-body-tertiary fs-9 fw-bold"></span></span>
<div class="d-flex">
<button class="page-link disabled" data-list-pagination="prev" disabled="">
<span class="fas fa-chevron-left"></span>
</button>
<ul class="mb-0 pagination">
<li class="active">
<button class="page" type="button" data-i="1" data-page="10">1</button>
</li>
<li>
<button class="page" type="button" data-i="2" data-page="5">2</button>
</li>
</ul>
<button class="page-link pe-0" data-list-pagination="next">
<span class="fas fa-chevron-right"></span>
</button>
</div>
</div>
</div>
</div>
<script>
document.addEventListener("DOMContentLoaded", function () {
let currentPage = 1;
function loadPage(page) {
fetch(`/api/cars/?page=${page}`)
.then(response => response.json())
.then(data => {
let tbody = document.querySelector("#car_list .list");
tbody.innerHTML = ""; // Clear table content
data.data.forEach(car => {
let row = document.createElement("tr");
row.innerHTML = `
<td class="align-middle ps-1 vin">${car.vin || "N/A"}</td>
<td class="align-middle make">${car.id_car_make__name}</td>
<td class="align-middle model">${car.id_car_model__name}</td>
<td class="align-middle status text-end py-3 pe-3">
<div class="badge badge-phoenix fs-10 badge-phoenix-${getBadgeClass(car.status)}">
<span class="fw-bold">${car.status}</span>
</div>
</td>
`;
tbody.appendChild(row);
});
updatePagination(data.page, data.total_pages, data.total_items, data.per_page);
})
.catch(error => console.error("Error loading car data:", error));
}
function updatePagination(currentPage, totalPages, totalItems, per_page) {
let pagination = document.querySelector(".pagination");
let paginationInfo = document.querySelector("[data-list-info]");
let prevButton = document.querySelector("[data-list-pagination='prev']");
let nextButton = document.querySelector("[data-list-pagination='next']");
// Update info text
let startItem = (currentPage - 1) * per_page + 1;
let endItem = Math.min(currentPage * per_page, totalItems);
paginationInfo.innerHTML = `${startItem} to ${endItem} <span class="text-body-tertiary fs-9 fw-bold"> Items of </span>${totalItems}`;
// Clear previous pagination
pagination.innerHTML = "";
// Generate page buttons dynamically
for (let i = 1; i <= totalPages; i++) {
let li = document.createElement("li");
li.className = currentPage === i ? "active" : "";
li.innerHTML = `<button class="page" type="button" data-i="${i}" data-page="${per_page}">${i}</button>`;
li.querySelector("button").addEventListener("click", () => {
currentPage = i;
loadPage(currentPage);
});
pagination.appendChild(li);
}
// Update previous & next buttons
prevButton.disabled = currentPage === 1;
nextButton.disabled = currentPage === totalPages;
prevButton.onclick = () => {
if (currentPage > 1) {
currentPage--;
loadPage(currentPage);
}
};
nextButton.onclick = () => {
if (currentPage < totalPages) {
currentPage++;
loadPage(currentPage);
}
};
}
function getBadgeClass(status) {
switch (status.toLowerCase()) {
case "available":
return "success";
case "sold":
return "primary";
case "reserved":
return "danger";
case "transfer":
return "info";
case "damaged":
return "secondary";
default:
return "secondary";
}
}
// Load the first page when the document is ready
loadPage(currentPage);
});
</script>
{% endblock %}