added pagination - subconractor mdel
This commit is contained in:
@@ -56,13 +56,31 @@ def save_subcontractor():
|
||||
return redirect(url_for("subcontractor.subcontractor_list"))
|
||||
|
||||
|
||||
# ---------------- LIST -----------------
|
||||
# ---------------- LIST (UPDATED WITH PAGINATION) -----------------
|
||||
@subcontractor_bp.route("/list")
|
||||
@login_required
|
||||
def subcontractor_list():
|
||||
subcontractors = Subcontractor.query.all()
|
||||
current_app.logger.info("Viewed Subcontractor List")
|
||||
return render_template("subcontractor/list.html", subcontractors=subcontractors)
|
||||
|
||||
page = request.args.get("page", 1, type=int)
|
||||
per_page = 10 # Change how many records per page
|
||||
|
||||
pagination = Subcontractor.query.order_by(
|
||||
Subcontractor.created_at
|
||||
).paginate(
|
||||
page=page,
|
||||
per_page=per_page,
|
||||
error_out=False
|
||||
)
|
||||
|
||||
subcontractors = pagination.items
|
||||
|
||||
current_app.logger.info(f"Viewed Subcontractor List - Page {page}")
|
||||
|
||||
return render_template(
|
||||
"subcontractor/list.html",
|
||||
subcontractors=subcontractors,
|
||||
pagination=pagination
|
||||
)
|
||||
|
||||
|
||||
# ---------------- EDIT -----------------
|
||||
@@ -103,10 +121,7 @@ def update_subcontractor(id):
|
||||
|
||||
db.session.commit()
|
||||
|
||||
current_app.logger.info(
|
||||
f"Subcontractor Updated: {old_name} → {new_name}"
|
||||
)
|
||||
|
||||
current_app.logger.info(f"Subcontractor Updated: {old_name} → {new_name}")
|
||||
flash("Subcontractor updated successfully!", "success")
|
||||
|
||||
except Exception:
|
||||
@@ -122,9 +137,9 @@ def update_subcontractor(id):
|
||||
@login_required
|
||||
def delete_subcontractor(id):
|
||||
subcontractor = Subcontractor.query.get_or_404(id)
|
||||
|
||||
try:
|
||||
name = subcontractor.subcontractor_name
|
||||
|
||||
db.session.delete(subcontractor)
|
||||
db.session.commit()
|
||||
|
||||
|
||||
@@ -1,94 +1,160 @@
|
||||
{% extends "base.html" %}
|
||||
{% block content %}
|
||||
|
||||
<div class="card shadow-sm p-3 p-md-4">
|
||||
<div class="container mt-4">
|
||||
|
||||
<!-- Header -->
|
||||
<div class="row mb-3 align-items-center">
|
||||
<div class="col-12 col-md-6 ">
|
||||
<h4 class="mb-2 mb-md-0 text-center text-md-start">
|
||||
Subcontractor List
|
||||
</h4>
|
||||
</div>
|
||||
<div class="d-flex flex-column flex-md-row justify-content-between align-items-md-center mb-3">
|
||||
<h4 class="mb-3 mb-md-0">Subcontractor List</h4>
|
||||
|
||||
<div class="col-12 col-md-3 text-center text-md-end">
|
||||
<!-- <a href="/subcontractor/add" class="btn btn-success w-100 w-md-auto"> -->
|
||||
<a href="{{ url_for('subcontractor.add_subcontractor') }}" class="btn btn-success"></a>
|
||||
➕ Add Subcontractor
|
||||
</a>
|
||||
</div>
|
||||
<a href="{{ url_for('subcontractor.add_subcontractor') }}" class="btn btn-primary btn-sm">
|
||||
+ Add Subcontractor
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="card shadow-sm">
|
||||
<div class="card-body p-2 p-md-3">
|
||||
|
||||
<div class="table-responsive">
|
||||
<table class="table table-bordered table-striped align-middle text-nowrap">
|
||||
<thead class="table-dark">
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Name</th>
|
||||
<th class="d-none d-md-table-cell">Mobile</th>
|
||||
<th class="d-none d-lg-table-cell">Email</th>
|
||||
<th class="d-none d-lg-table-cell">GST No</th>
|
||||
<th class="text-center">Action</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<!-- Desktop Table View -->
|
||||
<div class="table-responsive d-none d-md-block">
|
||||
<table class="table table-bordered table-hover align-middle">
|
||||
<thead class="table-dark">
|
||||
<tr>
|
||||
<th>ID</th>
|
||||
<th>Name</th>
|
||||
<th>Contact</th>
|
||||
<th>Mobile</th>
|
||||
<th>Email</th>
|
||||
<th>Status</th>
|
||||
<th width="150">Action</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for s in subcontractors %}
|
||||
<tr>
|
||||
<td>{{ s.id }}</td>
|
||||
<td>{{ s.subcontractor_name }}</td>
|
||||
<td>{{ s.contact_person }}</td>
|
||||
<td>{{ s.mobile_no }}</td>
|
||||
<td>{{ s.email_id }}</td>
|
||||
<td>
|
||||
{% if s.status == "Active" %}
|
||||
<span class="badge bg-success">Active</span>
|
||||
{% else %}
|
||||
<span class="badge bg-danger">Inactive</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>
|
||||
<a href="{{ url_for('subcontractor.edit_subcontractor', id=s.id) }}"
|
||||
class="btn btn-sm btn-warning mb-1">
|
||||
Edit
|
||||
</a>
|
||||
|
||||
<tbody>
|
||||
<a href="{{ url_for('subcontractor.delete_subcontractor', id=s.id) }}"
|
||||
class="btn btn-sm btn-danger" onclick="return confirm('Are you sure to delete?')">
|
||||
Delete
|
||||
</a>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<!-- Mobile Card View -->
|
||||
<div class="d-md-none">
|
||||
{% for s in subcontractors %}
|
||||
<tr>
|
||||
<td>{{ s.id }}</td>
|
||||
<div class="card mb-3 shadow-sm">
|
||||
<div class="card-body p-3">
|
||||
<h6 class="fw-bold mb-2">{{ s.subcontractor_name }}</h6>
|
||||
|
||||
<td class="fw-semibold text-wrap">
|
||||
{{ s.subcontractor_name }}
|
||||
</td>
|
||||
<p class="mb-1"><strong>Contact:</strong> {{ s.contact_person }}</p>
|
||||
<p class="mb-1"><strong>Mobile:</strong> {{ s.mobile_no }}</p>
|
||||
<p class="mb-1"><strong>Email:</strong> {{ s.email_id }}</p>
|
||||
|
||||
<td class="d-none d-md-table-cell">
|
||||
{{ s.mobile_no }}
|
||||
</td>
|
||||
<p class="mb-2">
|
||||
<strong>Status:</strong>
|
||||
{% if s.status == "Active" %}
|
||||
<span class="badge bg-success">Active</span>
|
||||
{% else %}
|
||||
<span class="badge bg-danger">Inactive</span>
|
||||
{% endif %}
|
||||
</p>
|
||||
|
||||
<td class="d-none d-lg-table-cell">
|
||||
{{ s.email_id }}
|
||||
</td>
|
||||
|
||||
<td class="d-none d-lg-table-cell">
|
||||
{{ s.gst_no }}
|
||||
</td>
|
||||
|
||||
<!-- Action Buttons -->
|
||||
<td class="text-center">
|
||||
<div class="d-flex flex-column gap-1">
|
||||
<!-- <a href="/subcontractor/edit/{{ s.id }}" class="btn btn-sm btn-warning"> -->
|
||||
<div class="d-flex gap-2">
|
||||
<a href="{{ url_for('subcontractor.edit_subcontractor', id=s.id) }}"
|
||||
class="btn btn-warning btn-sm"></a>
|
||||
Edit
|
||||
class="btn btn-sm btn-warning w-50">
|
||||
Edit
|
||||
</a>
|
||||
<!-- <a href="/subcontractor/delete/{{ s.id }}" class="btn btn-sm btn-danger"
|
||||
onclick="return confirm('Are you sure?')"> -->
|
||||
|
||||
<a href="{{ url_for('subcontractor.delete_subcontractor', id=s.id) }}"
|
||||
class="btn btn-danger btn-sm" onclick="return confirm('Are you sure?')">
|
||||
class="btn btn-sm btn-danger w-50" onclick="return confirm('Are you sure to delete?')">
|
||||
Delete
|
||||
</a>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</div>
|
||||
|
||||
<!-- TOTAL ROW -->
|
||||
<tfoot>
|
||||
<tr class="table-secondary fw-bold">
|
||||
<td colspan="2" class="text-end"> Total Subcontractors</td>
|
||||
<!-- Pagination -->
|
||||
<nav>
|
||||
<ul class="pagination justify-content-center flex-wrap mt-4">
|
||||
|
||||
<td class="d-none d-lg-table-cell">-</td>
|
||||
<td class="d-none d-lg-table-cell">-</td>
|
||||
<td class="d-none d-lg-table-cell">-</td>
|
||||
{% if pagination.has_prev %}
|
||||
<li class="page-item">
|
||||
<a class="page-link" href="{{ url_for('subcontractor.subcontractor_list', page=1) }}">
|
||||
First
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<td class="text-center">{{ subcontractors|length }}</td>
|
||||
<li class="page-item">
|
||||
<a class="page-link"
|
||||
href="{{ url_for('subcontractor.subcontractor_list', page=pagination.prev_num) }}">
|
||||
Prev
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
</tr>
|
||||
</tfoot>
|
||||
{% for page_num in pagination.iter_pages() %}
|
||||
{% if page_num %}
|
||||
{% if page_num != pagination.page %}
|
||||
<li class="page-item">
|
||||
<a class="page-link" href="{{ url_for('subcontractor.subcontractor_list', page=page_num) }}">
|
||||
{{ page_num }}
|
||||
</a>
|
||||
</li>
|
||||
{% else %}
|
||||
<li class="page-item active">
|
||||
<span class="page-link">{{ page_num }}</span>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<li class="page-item disabled">
|
||||
<span class="page-link">...</span>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
</table>
|
||||
{% if pagination.has_next %}
|
||||
<li class="page-item">
|
||||
<a class="page-link"
|
||||
href="{{ url_for('subcontractor.subcontractor_list', page=pagination.next_num) }}">
|
||||
Next
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="page-item">
|
||||
<a class="page-link"
|
||||
href="{{ url_for('subcontractor.subcontractor_list', page=pagination.pages) }}">
|
||||
Last
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user