2025-12-11 10:16:43 +05:30
|
|
|
<!DOCTYPE html>
|
|
|
|
|
<html lang="en">
|
|
|
|
|
|
|
|
|
|
<head>
|
|
|
|
|
<meta charset="UTF-8">
|
2026-01-12 13:32:09 +05:30
|
|
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
|
|
|
<title>{{ title if title else "Comparison Software" }}</title>
|
2026-07-30 14:38:37 +05:30
|
|
|
<link rel="icon" type="image/png" href="{{ url_for('static', filename='images/lcepl.png') }}">
|
2025-12-11 10:16:43 +05:30
|
|
|
|
2026-01-12 13:32:09 +05:30
|
|
|
<!-- Bootstrap CSS -->
|
2026-07-30 14:38:37 +05:30
|
|
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css">
|
2026-01-12 13:32:09 +05:30
|
|
|
|
|
|
|
|
<!-- Bootstrap Icons -->
|
2026-07-30 14:38:37 +05:30
|
|
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons/font/bootstrap-icons.css" >
|
|
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="https://cdn.datatables.net/1.13.6/css/jquery.dataTables.min.css">
|
|
|
|
|
<link rel="stylesheet" href="https://cdn.datatables.net/buttons/2.4.1/css/buttons.dataTables.min.css">
|
|
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-multiselect@1.1.2/dist/css/bootstrap-multiselect.min.css">
|
2025-12-11 10:16:43 +05:30
|
|
|
</head>
|
|
|
|
|
|
2026-01-12 13:32:09 +05:30
|
|
|
<body class="bg-light">
|
2025-12-11 10:16:43 +05:30
|
|
|
|
2026-01-12 13:32:09 +05:30
|
|
|
<!-- NAVBAR -->
|
2026-01-16 13:04:59 +05:30
|
|
|
<nav class="navbar navbar-expand-lg navbar-dark bg-dark shadow-sm fixed-top">
|
|
|
|
|
|
2025-12-11 10:16:43 +05:30
|
|
|
<div class="container-fluid">
|
|
|
|
|
|
2026-01-12 13:32:09 +05:30
|
|
|
<!-- Brand -->
|
|
|
|
|
<a class="navbar-brand fw-bold" href="/">
|
|
|
|
|
<i class="bi bi-buildings me-1"></i> LCEPL
|
|
|
|
|
</a>
|
|
|
|
|
|
|
|
|
|
<!-- Mobile toggle -->
|
2025-12-11 10:16:43 +05:30
|
|
|
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navMenu">
|
|
|
|
|
<span class="navbar-toggler-icon"></span>
|
|
|
|
|
</button>
|
|
|
|
|
|
2026-01-12 13:32:09 +05:30
|
|
|
<!-- Menu -->
|
2025-12-11 10:16:43 +05:30
|
|
|
<div class="collapse navbar-collapse" id="navMenu">
|
2026-01-12 13:32:09 +05:30
|
|
|
<ul class="navbar-nav ms-auto align-items-lg-center">
|
2025-12-11 10:16:43 +05:30
|
|
|
|
2026-01-12 13:32:09 +05:30
|
|
|
<!-- Dashboard -->
|
|
|
|
|
<li class="nav-item">
|
|
|
|
|
<a class="nav-link" href="/dashboard">
|
|
|
|
|
<i class="bi bi-speedometer2 me-1"></i> Dashboard
|
|
|
|
|
</a>
|
|
|
|
|
</li>
|
2025-12-12 11:38:54 +05:30
|
|
|
|
2026-01-13 13:21:06 +05:30
|
|
|
<!-- Subcontractor Model -->
|
2025-12-11 10:16:43 +05:30
|
|
|
<li class="nav-item dropdown">
|
2026-01-12 13:32:09 +05:30
|
|
|
<a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#">
|
2026-07-30 14:38:37 +05:30
|
|
|
<i class="bi bi-people-fill me-1"></i> Subcontractor List
|
2026-01-12 13:32:09 +05:30
|
|
|
</a>
|
2025-12-11 10:16:43 +05:30
|
|
|
<ul class="dropdown-menu dropdown-menu-dark">
|
2026-01-12 13:32:09 +05:30
|
|
|
<li>
|
|
|
|
|
<a class="dropdown-item" href="/subcontractor/add">
|
2026-07-30 14:38:37 +05:30
|
|
|
<i class="bi bi-plus-circle me-2"></i> New Add
|
2026-01-12 13:32:09 +05:30
|
|
|
</a>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<a class="dropdown-item" href="/subcontractor/list">
|
2026-07-30 14:38:37 +05:30
|
|
|
<i class="bi bi-list-ul me-2"></i> List
|
2026-01-12 13:32:09 +05:30
|
|
|
</a>
|
|
|
|
|
</li>
|
2025-12-11 10:16:43 +05:30
|
|
|
</ul>
|
|
|
|
|
</li>
|
2025-12-13 18:50:27 +05:30
|
|
|
|
2026-01-13 13:21:06 +05:30
|
|
|
<!-- Subcontractor File System -->
|
2025-12-13 18:50:27 +05:30
|
|
|
<li class="nav-item dropdown">
|
2026-01-12 13:32:09 +05:30
|
|
|
<a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#">
|
2026-07-30 14:38:37 +05:30
|
|
|
<i class="bi bi-folder-fill me-1"></i>Subcontractor RA Bills
|
2026-01-12 13:32:09 +05:30
|
|
|
</a>
|
2025-12-13 18:50:27 +05:30
|
|
|
<ul class="dropdown-menu dropdown-menu-dark">
|
2026-01-12 13:32:09 +05:30
|
|
|
<li>
|
2026-07-30 14:38:37 +05:30
|
|
|
<a class="dropdown-item" href="/dashboard/subcontractor_dashboard">
|
|
|
|
|
<i class="bi bi-speedometer2 me-2"></i> Subcontractor Dashboard
|
2026-01-12 13:32:09 +05:30
|
|
|
</a>
|
|
|
|
|
</li>
|
2026-07-30 14:38:37 +05:30
|
|
|
|
2026-01-12 13:32:09 +05:30
|
|
|
<li>
|
2026-07-30 14:38:37 +05:30
|
|
|
<a class="dropdown-item" href="/file/import_Subcontractor">
|
|
|
|
|
<i class="bi bi-upload me-2"></i> Import File
|
2026-01-12 13:32:09 +05:30
|
|
|
</a>
|
|
|
|
|
</li>
|
2026-01-17 17:39:31 +05:30
|
|
|
<li>
|
2026-07-30 14:38:37 +05:30
|
|
|
<a class="dropdown-item" href="/file/Subcontractor_report">
|
|
|
|
|
<i class="bi bi-arrow-left-right me-2"></i> Show Reports
|
2026-01-17 17:39:31 +05:30
|
|
|
</a>
|
|
|
|
|
</li>
|
|
|
|
|
|
2025-12-13 18:50:27 +05:30
|
|
|
</ul>
|
|
|
|
|
</li>
|
|
|
|
|
|
2026-01-12 13:32:09 +05:30
|
|
|
<!-- Client System -->
|
2025-12-13 18:50:27 +05:30
|
|
|
<li class="nav-item dropdown">
|
2026-01-12 13:32:09 +05:30
|
|
|
<a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#">
|
2026-07-30 14:38:37 +05:30
|
|
|
<i class="bi bi-building me-1"></i> Client RA Bills
|
2026-01-12 13:32:09 +05:30
|
|
|
</a>
|
2025-12-13 18:50:27 +05:30
|
|
|
<ul class="dropdown-menu dropdown-menu-dark">
|
2026-01-12 13:32:09 +05:30
|
|
|
<li>
|
|
|
|
|
<a class="dropdown-item" href="/file/import_client">
|
|
|
|
|
<i class="bi bi-upload me-2"></i> Import Client File
|
|
|
|
|
</a>
|
|
|
|
|
</li>
|
|
|
|
|
|
2026-01-13 13:21:06 +05:30
|
|
|
<li>
|
2026-01-17 14:01:15 +05:30
|
|
|
<a class="dropdown-item" href="/file/client_report">
|
2026-01-16 13:04:59 +05:30
|
|
|
<i class="bi bi-arrow-left-right me-2"></i> Show Report
|
2026-01-13 13:21:06 +05:30
|
|
|
</a>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
<!-- Reports -->
|
|
|
|
|
<li class="nav-item dropdown">
|
|
|
|
|
<a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#">
|
2026-07-30 14:38:37 +05:30
|
|
|
<i class="bi bi-building me-1"></i> Comparison Report
|
2026-01-13 13:21:06 +05:30
|
|
|
</a>
|
|
|
|
|
<ul class="dropdown-menu dropdown-menu-dark">
|
|
|
|
|
|
2026-01-12 13:32:09 +05:30
|
|
|
<li>
|
|
|
|
|
<a class="dropdown-item" href="/report/comparison_report">
|
2026-07-30 14:38:37 +05:30
|
|
|
<i class="bi bi-arrow-left-right me-2"></i> Client vs Subcontractor
|
2026-01-12 13:32:09 +05:30
|
|
|
</a>
|
|
|
|
|
</li>
|
2026-08-06 12:20:50 +05:30
|
|
|
|
2025-12-13 18:50:27 +05:30
|
|
|
</ul>
|
|
|
|
|
</li>
|
|
|
|
|
|
2026-08-06 12:20:50 +05:30
|
|
|
<!-- Masters -->
|
|
|
|
|
<li class="nav-item dropdown">
|
|
|
|
|
<a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="/engi">
|
|
|
|
|
<i class="bi bi-gear me-2"></i> Masters
|
2026-01-12 13:32:09 +05:30
|
|
|
</a>
|
2026-08-06 12:20:50 +05:30
|
|
|
<ul class="dropdown-menu dropdown-menu-dark">
|
|
|
|
|
<!-- Client Standard Rates -->
|
|
|
|
|
<li class="nav-item">
|
|
|
|
|
<a class="nav-link" href="/engi/subcontractor-rate">
|
|
|
|
|
<i class="bi bi-file-earmark-text me-1"></i> Rate Master
|
|
|
|
|
</a>
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
<!-- Client Standard Rates -->
|
|
|
|
|
<li class="nav-item">
|
|
|
|
|
<a class="nav-link" href="/engi/client-rate">
|
|
|
|
|
<i class="bi bi-file-earmark-text me-1"></i> Client Standard Rates
|
|
|
|
|
</a>
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
<!-- Formats -->
|
|
|
|
|
<li class="nav-item">
|
|
|
|
|
<a class="nav-link" href="/file_format">
|
|
|
|
|
<i class="bi bi-file-earmark-text me-1"></i> Formats
|
|
|
|
|
</a>
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
</ul>
|
2026-01-10 01:04:21 +05:30
|
|
|
</li>
|
2026-01-12 13:32:09 +05:30
|
|
|
|
|
|
|
|
|
2026-08-06 12:20:50 +05:30
|
|
|
<!-- USER DROPDOWN -->
|
|
|
|
|
<li class="nav-item dropdown">
|
|
|
|
|
|
|
|
|
|
<a class="nav-link dropdown-toggle d-flex align-items-center text-white"
|
|
|
|
|
href="#" id="profileDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
|
|
|
|
|
|
|
|
|
<i class="bi bi-person-circle fs-4"></i>
|
|
|
|
|
<span class="ms-2 fw-semibold">
|
2026-01-12 13:32:09 +05:30
|
|
|
{{ session.get("user_name") }}
|
|
|
|
|
</span>
|
|
|
|
|
</a>
|
|
|
|
|
|
2026-08-06 12:20:50 +05:30
|
|
|
<ul class="dropdown-menu dropdown-menu-end dropdown-menu-dark border-0 shadow-lg bg-dark p-0"
|
|
|
|
|
style="width:320px;">
|
2026-01-12 13:32:09 +05:30
|
|
|
|
2026-08-06 12:20:50 +05:30
|
|
|
<!-- Profile Header -->
|
|
|
|
|
<li class="text-center py-4 border-bottom border-secondary">
|
|
|
|
|
<i class="bi bi-person-circle text-light" style="font-size:60px;"></i>
|
|
|
|
|
<h5 class="mt-2 mb-0 fw-bold">
|
2026-01-12 13:32:09 +05:30
|
|
|
{{ session.get("user_name") }}
|
2026-08-06 12:20:50 +05:30
|
|
|
</h5>
|
|
|
|
|
<small class="text-secondary">
|
|
|
|
|
{{ session.get("email") }}
|
|
|
|
|
</small>
|
2026-01-12 13:32:09 +05:30
|
|
|
</li>
|
|
|
|
|
|
2026-08-06 12:20:50 +05:30
|
|
|
<!-- Dashboard -->
|
2026-01-12 13:32:09 +05:30
|
|
|
<li>
|
2026-08-06 12:20:50 +05:30
|
|
|
<a class="dropdown-item text-light py-2" href="{{ url_for('dashboard.dashboard') }}">
|
2026-01-12 13:32:09 +05:30
|
|
|
<i class="bi bi-speedometer2 me-2"></i> Dashboard
|
|
|
|
|
</a>
|
|
|
|
|
</li>
|
2026-08-06 12:20:50 +05:30
|
|
|
|
|
|
|
|
<!-- Activity Log page -->
|
|
|
|
|
<li>
|
|
|
|
|
<a class="dropdown-item text-light py-2" href="{{ url_for('activity.activity') }}">
|
|
|
|
|
<i class="bi bi-clock-history me-2"></i> Activity Log
|
|
|
|
|
</a>
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
|
|
<!-- Manage Account -->
|
2026-08-01 15:41:26 +05:30
|
|
|
<li>
|
2026-08-06 12:20:50 +05:30
|
|
|
<a class="dropdown-item py-2" href="#">
|
|
|
|
|
<i class="bi bi-gear me-2"></i> Manage Account
|
2026-08-01 15:41:26 +05:30
|
|
|
</a>
|
|
|
|
|
</li>
|
2026-08-06 12:20:50 +05:30
|
|
|
|
|
|
|
|
<li><hr class="dropdown-divider border-secondary m-0"></li>
|
2026-01-12 13:32:09 +05:30
|
|
|
|
2026-08-06 12:20:50 +05:30
|
|
|
<!-- Logout Account -->
|
2026-01-12 13:32:09 +05:30
|
|
|
<li>
|
2026-08-06 12:20:50 +05:30
|
|
|
<a class="dropdown-item text-warning py-2" href="{{ url_for('auth.logout') }}">
|
|
|
|
|
<i class="bi bi-box-arrow-right me-2"></i>
|
|
|
|
|
Logout
|
2026-01-12 13:32:09 +05:30
|
|
|
</a>
|
|
|
|
|
</li>
|
|
|
|
|
|
2026-08-06 12:20:50 +05:30
|
|
|
<!-- Footer -->
|
|
|
|
|
<li class="text-center py-3 bg-secondary bg-opacity-10 border-top border-secondary">
|
|
|
|
|
<small class="text-light">
|
|
|
|
|
<i class="bi bi-shield-check text-success"></i>
|
|
|
|
|
Secured by <strong>LCEPL</strong>
|
|
|
|
|
</small>
|
|
|
|
|
</li>
|
|
|
|
|
|
2026-01-12 13:32:09 +05:30
|
|
|
</ul>
|
2026-08-06 12:20:50 +05:30
|
|
|
|
2026-01-10 01:04:21 +05:30
|
|
|
</li>
|
|
|
|
|
|
2025-12-11 10:16:43 +05:30
|
|
|
</ul>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</nav>
|
|
|
|
|
|
|
|
|
|
|
2026-01-12 13:32:09 +05:30
|
|
|
<!-- PAGE CONTENT -->
|
2026-01-16 13:04:59 +05:30
|
|
|
<div class="container-fluid vh-100 pt-5 overflow-hidden">
|
|
|
|
|
<!-- FLASH MESSAGES -->
|
2026-08-01 15:41:26 +05:30
|
|
|
<div class="position-fixed top-0 end-0 p-2 p-md-3 mt-5" style="z-index:1080; width:min(95vw,500px);">
|
2026-07-30 14:38:37 +05:30
|
|
|
|
2026-01-16 13:04:59 +05:30
|
|
|
{% with messages = get_flashed_messages(with_categories=true) %}
|
|
|
|
|
{% if messages %}
|
|
|
|
|
{% for category, message in messages %}
|
2026-07-30 14:38:37 +05:30
|
|
|
|
|
|
|
|
<div class="alert alert-{{ category }} alert-dismissible fade show shadow notification-alert mb-2"
|
|
|
|
|
role="alert">
|
|
|
|
|
|
|
|
|
|
<div class="d-flex align-items-start flex-wrap">
|
|
|
|
|
|
|
|
|
|
{% if category == 'success' %}
|
|
|
|
|
<i class="bi bi-check-circle-fill me-2 fs-5 flex-shrink-0"></i>
|
|
|
|
|
{% elif category == 'danger' %}
|
|
|
|
|
<i class="bi bi-x-circle-fill me-2 fs-5 flex-shrink-0"></i>
|
|
|
|
|
{% elif category == 'warning' %}
|
|
|
|
|
<i class="bi bi-exclamation-triangle-fill me-2 fs-5 flex-shrink-0"></i>
|
|
|
|
|
{% elif category == 'info' %}
|
|
|
|
|
<i class="bi bi-info-circle-fill me-2 fs-5 flex-shrink-0"></i>
|
|
|
|
|
{% endif %}
|
|
|
|
|
|
|
|
|
|
<div class="flex-grow-1">
|
|
|
|
|
|
|
|
|
|
<div class="fw-semibold">
|
|
|
|
|
{% if category == 'success' %}
|
|
|
|
|
Success
|
|
|
|
|
{% elif category == 'danger' %}
|
|
|
|
|
Error
|
|
|
|
|
{% elif category == 'warning' %}
|
|
|
|
|
Warning
|
|
|
|
|
{% elif category == 'info' %}
|
|
|
|
|
Information
|
|
|
|
|
{% endif %}
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<div>
|
|
|
|
|
{{ message }}
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<!-- Timeline -->
|
|
|
|
|
<div class="progress mt-2" style="height:5px;">
|
2026-08-01 15:41:26 +05:30
|
|
|
<div class="progress-bar progress-bar-striped progress-bar-animated timer-bar" role="progressbar" style="width:100%">
|
2026-07-30 14:38:37 +05:30
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
2026-08-01 15:41:26 +05:30
|
|
|
<button type="button" class="btn-close" data-bs-dismiss="alert">
|
2026-07-30 14:38:37 +05:30
|
|
|
</button>
|
|
|
|
|
|
2026-01-16 13:04:59 +05:30
|
|
|
</div>
|
2026-07-30 14:38:37 +05:30
|
|
|
|
2026-01-16 13:04:59 +05:30
|
|
|
{% endfor %}
|
|
|
|
|
{% endif %}
|
|
|
|
|
{% endwith %}
|
|
|
|
|
|
2026-07-30 14:38:37 +05:30
|
|
|
</div>
|
2026-01-16 13:04:59 +05:30
|
|
|
|
|
|
|
|
<div class="overflow-auto h-100">
|
|
|
|
|
<div class="container mt-4">
|
|
|
|
|
{% block content %}{% endblock %}
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
2025-12-11 10:16:43 +05:30
|
|
|
</div>
|
|
|
|
|
|
2026-07-30 14:38:37 +05:30
|
|
|
<!-- Global Loading Overlay -->
|
|
|
|
|
<div id="globalLoader"
|
|
|
|
|
class="position-fixed top-0 start-0 w-100 h-100 bg-dark bg-opacity-50 d-none"
|
|
|
|
|
style="z-index:9999;">
|
|
|
|
|
|
|
|
|
|
<div class="d-flex justify-content-center align-items-center h-100">
|
|
|
|
|
<div class="card shadow-lg border-0 rounded-4" style="width:430px;">
|
|
|
|
|
<div class="card-body text-center p-5">
|
|
|
|
|
|
|
|
|
|
<div class="spinner-border text-primary" style="width:70px;height:70px;"role="status">
|
|
|
|
|
</div>
|
|
|
|
|
<h4 class="fw-bold mt-4 mb-2">Please Wait...</h4>
|
|
|
|
|
<p id="loaderMessage" class="text-muted mb-4">Processing your request...</p>
|
|
|
|
|
|
|
|
|
|
<div class="progress" style="height:8px;">
|
|
|
|
|
<div class="progress-bar progress-bar-striped progress-bar-animated"
|
|
|
|
|
style="width:100%">
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
</div>
|
2026-01-16 13:04:59 +05:30
|
|
|
|
2026-01-12 13:32:09 +05:30
|
|
|
<!-- Bootstrap JS -->
|
2025-12-11 10:16:43 +05:30
|
|
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
2026-01-12 13:32:09 +05:30
|
|
|
|
2026-07-30 14:38:37 +05:30
|
|
|
<script src="https://code.jquery.com/jquery-3.7.0.min.js"></script>
|
|
|
|
|
<script src="https://cdn.datatables.net/1.13.6/js/jquery.dataTables.min.js"></script>
|
|
|
|
|
|
|
|
|
|
<script src="https://cdn.datatables.net/buttons/2.4.1/js/dataTables.buttons.min.js"></script>
|
|
|
|
|
<script src="https://cdn.datatables.net/buttons/2.4.1/js/buttons.html5.min.js"></script>
|
|
|
|
|
<script src="https://cdn.datatables.net/buttons/2.4.1/js/buttons.print.min.js"></script>
|
|
|
|
|
|
|
|
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"></script>
|
|
|
|
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap-multiselect@1.1.2/dist/js/bootstrap-multiselect.min.js"></script>
|
|
|
|
|
|
|
|
|
|
<script>
|
2026-08-01 15:41:26 +05:30
|
|
|
// show alert msg
|
2026-07-30 14:38:37 +05:30
|
|
|
document.addEventListener("DOMContentLoaded", function () {
|
|
|
|
|
document.querySelectorAll(".notification-alert").forEach(function(alert){
|
|
|
|
|
const progressBar = alert.querySelector(".timer-bar");
|
|
|
|
|
let width = 100;
|
|
|
|
|
const interval = setInterval(function() {
|
|
|
|
|
width -= 2;
|
|
|
|
|
progressBar.style.width = width + "%";
|
|
|
|
|
if(width <= 0){
|
|
|
|
|
clearInterval(interval);
|
|
|
|
|
const bsAlert = bootstrap.Alert.getOrCreateInstance(alert);
|
|
|
|
|
bsAlert.close();
|
|
|
|
|
}
|
|
|
|
|
}, 100);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
2026-08-01 15:41:26 +05:30
|
|
|
// show msg Processing your request
|
|
|
|
|
function showLoader(message = "Processing your request...") {
|
2026-07-30 14:38:37 +05:30
|
|
|
document.getElementById("loaderMessage").innerHTML = message;
|
|
|
|
|
document.getElementById("globalLoader").classList.remove("d-none");
|
|
|
|
|
}
|
|
|
|
|
|
2026-08-01 15:41:26 +05:30
|
|
|
// Automatically hide
|
2026-07-30 14:38:37 +05:30
|
|
|
function hideLoader(){
|
|
|
|
|
document.getElementById("globalLoader").classList.add("d-none");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Automatically apply to all forms having class="loading-form"
|
|
|
|
|
document.addEventListener("DOMContentLoaded", function () {
|
|
|
|
|
document.querySelectorAll(".loading-form").forEach(function(form){
|
|
|
|
|
form.addEventListener("submit", function(){
|
|
|
|
|
if(!this.checkValidity())
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
showLoader();
|
|
|
|
|
const btn = this.querySelector("button[type='submit']");
|
|
|
|
|
|
|
|
|
|
if(btn){
|
|
|
|
|
btn.disabled = true;
|
|
|
|
|
btn.innerHTML = `
|
|
|
|
|
<span class="spinner-border spinner-border-sm me-2"></span>
|
|
|
|
|
Processing...
|
|
|
|
|
`;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
2025-12-11 10:16:43 +05:30
|
|
|
</body>
|
|
|
|
|
|
2025-12-13 18:50:27 +05:30
|
|
|
</html>
|