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