added full project files
This commit is contained in:
87
static/js/block.js
Normal file
87
static/js/block.js
Normal file
@@ -0,0 +1,87 @@
|
||||
window.onload = function () {
|
||||
document.getElementById('block_Name').focus();
|
||||
};
|
||||
|
||||
|
||||
$(document).ready(function () {
|
||||
$("#block_Name").on("input", function () {
|
||||
let blockName = $(this).val();
|
||||
let cleanedName = blockName.replace(/[^A-Za-z ]/g, "");
|
||||
$(this).val(cleanedName);
|
||||
});
|
||||
|
||||
$("#block_Name, #district_Id").on("input change", function () {
|
||||
let blockName = $("#block_Name").val().trim();
|
||||
let districtId = $("#district_Id").val();
|
||||
|
||||
if (blockName === "" || districtId === "") {
|
||||
$("#blockMessage").text("").css("color", "");
|
||||
$("#submitButton").prop("disabled", true);
|
||||
return;
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
url: "/check_block",
|
||||
type: "POST",
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify({ block_Name: blockName, district_Id: districtId }),
|
||||
success: function (response) {
|
||||
if (response.status === "available") {
|
||||
$("#blockMessage").text(response.message).css("color", "green");
|
||||
$("#submitButton").prop("disabled", false);
|
||||
}
|
||||
},
|
||||
error: function (xhr) {
|
||||
if (xhr.status === 409) {
|
||||
$("#blockMessage").text("Block already exists!").css("color", "red");
|
||||
$("#submitButton").prop("disabled", true);
|
||||
} else if (xhr.status === 400) {
|
||||
$("#blockMessage").text("Invalid block name! Only letters are allowed.").css("color", "red");
|
||||
$("#submitButton").prop("disabled", true);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$("#blockForm").on("submit", function (event) {
|
||||
event.preventDefault();
|
||||
$.ajax({
|
||||
url: "/add_block",
|
||||
type: "POST",
|
||||
data: $(this).serialize(),
|
||||
success: function (response) {
|
||||
alert(response.message);
|
||||
location.reload();
|
||||
},
|
||||
error: function (xhr) {
|
||||
alert(xhr.responseJSON.message);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$('#state_Id').change(function() {
|
||||
var stateId = $(this).val();
|
||||
if (stateId) {
|
||||
$.ajax({
|
||||
url: '/get_districts/' + stateId,
|
||||
type: 'GET',
|
||||
success: function(data) {
|
||||
var districtDropdown = $('#district_Id');
|
||||
districtDropdown.empty();
|
||||
districtDropdown.append('<option value="" disabled selected>Select District</option>');
|
||||
|
||||
data.districts.forEach(function(district) {
|
||||
districtDropdown.append('<option value="' + district.District_id + '">' + district.District_Name + '</option>');
|
||||
});
|
||||
|
||||
districtDropdown.prop('disabled', false);
|
||||
},
|
||||
error: function() {
|
||||
alert('Error fetching districts. Please try again.');
|
||||
}
|
||||
});
|
||||
} else {
|
||||
$('#district_Id').prop('disabled', true);
|
||||
}
|
||||
});
|
||||
});
|
||||
62
static/js/district.js
Normal file
62
static/js/district.js
Normal file
@@ -0,0 +1,62 @@
|
||||
window.onload = function () {
|
||||
document.getElementById('district_Name').focus();
|
||||
};
|
||||
|
||||
|
||||
$(document).ready(function () {
|
||||
$("#district_Name").on("input", function () {
|
||||
let districtName = $(this).val();
|
||||
// Remove numbers and special characters automatically
|
||||
let cleanedName = districtName.replace(/[^A-Za-z ]/g, "");
|
||||
$(this).val(cleanedName);
|
||||
});
|
||||
|
||||
$("#district_Name, #state_Id").on("input change", function () {
|
||||
let districtName = $("#district_Name").val().trim();
|
||||
let stateId = $("#state_Id").val();
|
||||
|
||||
if (districtName === "" || stateId === "") {
|
||||
$("#districtMessage").text("").css("color", "");
|
||||
$("#submitButton").prop("disabled", true);
|
||||
return;
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
url: "/check_district",
|
||||
type: "POST",
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify({ district_Name: districtName, state_Id: stateId }),
|
||||
success: function (response) {
|
||||
if (response.status === "available") {
|
||||
$("#districtMessage").text(response.message).css("color", "green");
|
||||
$("#submitButton").prop("disabled", false);
|
||||
}
|
||||
},
|
||||
error: function (xhr) {
|
||||
if (xhr.status === 409) {
|
||||
$("#districtMessage").text("District already exists!").css("color", "red");
|
||||
$("#submitButton").prop("disabled", true);
|
||||
} else if (xhr.status === 400) {
|
||||
$("#districtMessage").text("Invalid district name! Only letters are allowed.").css("color", "red");
|
||||
$("#submitButton").prop("disabled", true);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$("#districtForm").on("submit", function (event) {
|
||||
event.preventDefault();
|
||||
$.ajax({
|
||||
url: "/add_district",
|
||||
type: "POST",
|
||||
data: $(this).serialize(),
|
||||
success: function (response) {
|
||||
alert(response.message);
|
||||
location.reload();
|
||||
},
|
||||
error: function (xhr) {
|
||||
alert(xhr.responseJSON.message);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
18
static/js/edit_hold_type.js
Normal file
18
static/js/edit_hold_type.js
Normal file
@@ -0,0 +1,18 @@
|
||||
$("#updateHoldTypeForm").on("submit", function(event) {
|
||||
event.preventDefault();
|
||||
let holdTypeId = $("#hold_type_id").val();
|
||||
let newHoldType = $("#edit_hold_type").val().trim();
|
||||
let reg = /^[A-Za-z]/;
|
||||
|
||||
if (!reg.test(newHoldType)) {
|
||||
alert("Hold Type must start with a letter.");
|
||||
return;
|
||||
}
|
||||
|
||||
$.post(`/update_hold_type/${holdTypeId}`, { hold_type: newHoldType }, function(response) {
|
||||
alert(response.message);
|
||||
window.location.href = "/";
|
||||
}).fail(function(xhr) {
|
||||
alert(xhr.responseJSON.message);
|
||||
});
|
||||
});
|
||||
95
static/js/holdAmount.js
Normal file
95
static/js/holdAmount.js
Normal file
@@ -0,0 +1,95 @@
|
||||
$(document).ready(function () {
|
||||
// Create a module to manage hold amounts
|
||||
window.holdAmountModule = {
|
||||
holdCount: 0,
|
||||
holdTypes: [],
|
||||
|
||||
init: function() {
|
||||
this.loadHoldTypes();
|
||||
this.setupEventListeners();
|
||||
},
|
||||
|
||||
loadHoldTypes: function() {
|
||||
$.ajax({
|
||||
url: '/get_hold_types',
|
||||
method: 'GET',
|
||||
dataType: 'json',
|
||||
success: (data) => {
|
||||
this.holdTypes = data;
|
||||
$("#add_hold_amount").prop('disabled', false);
|
||||
},
|
||||
error: (err) => {
|
||||
console.error('Failed to load hold types', err);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
setupEventListeners: function() {
|
||||
$("#add_hold_amount").click(() => this.addHoldAmountField());
|
||||
$(document).on("click", ".remove-hold", (e) => this.removeHoldAmountField(e));
|
||||
$(document).on("change", ".hold-type-dropdown", () => this.refreshDropdowns());
|
||||
$(document).on("input", "input[name='hold_amount[]']", () => this.triggerHoldAmountChanged());
|
||||
},
|
||||
|
||||
addHoldAmountField: function() {
|
||||
this.holdCount++;
|
||||
$("#hold_amount_container").append(`
|
||||
<div class="hold-amount-field" id="hold_${this.holdCount}">
|
||||
<select name="hold_type[]" class="hold-type-dropdown" required>
|
||||
${this.generateOptions()}
|
||||
</select>
|
||||
<input type="number" step="0.01" name="hold_amount[]"
|
||||
class="hold-amount-input" placeholder="Hold Amount" required>
|
||||
<button type="button" class="remove-hold" data-id="hold_${this.holdCount}">X</button>
|
||||
</div>
|
||||
`);
|
||||
this.refreshDropdowns();
|
||||
this.triggerHoldAmountChanged();
|
||||
},
|
||||
|
||||
removeHoldAmountField: function(e) {
|
||||
const id = $(e.target).attr("data-id");
|
||||
$(`#${id}`).remove();
|
||||
this.refreshDropdowns();
|
||||
this.triggerHoldAmountChanged();
|
||||
},
|
||||
|
||||
generateOptions: function(selectedForThisDropdown = '') {
|
||||
const selectedValues = $("select[name='hold_type[]']").map(function() {
|
||||
return $(this).val();
|
||||
}).get();
|
||||
|
||||
let options = '<option value="">Select Hold Type</option>';
|
||||
this.holdTypes.forEach((type) => {
|
||||
if (!selectedValues.includes(type.hold_type) || type.hold_type === selectedForThisDropdown) {
|
||||
options += `<option value="${type.hold_type}">${type.hold_type}</option>`;
|
||||
}
|
||||
});
|
||||
return options;
|
||||
},
|
||||
|
||||
refreshDropdowns: function() {
|
||||
$("select[name='hold_type[]']").each(function() {
|
||||
const currentVal = $(this).val();
|
||||
$(this).html(window.holdAmountModule.generateOptions(currentVal));
|
||||
$(this).val(currentVal);
|
||||
});
|
||||
},
|
||||
|
||||
getTotalHoldAmount: function() {
|
||||
let total = 0;
|
||||
$("input[name='hold_amount[]']").each(function() {
|
||||
total += parseFloat($(this).val()) || 0;
|
||||
});
|
||||
return total;
|
||||
},
|
||||
|
||||
triggerHoldAmountChanged: function() {
|
||||
const event = new Event('holdAmountChanged');
|
||||
document.dispatchEvent(event);
|
||||
}
|
||||
};
|
||||
|
||||
// Initialize the module
|
||||
window.holdAmountModule.init();
|
||||
});
|
||||
39
static/js/hold_types.js
Normal file
39
static/js/hold_types.js
Normal file
@@ -0,0 +1,39 @@
|
||||
$(document).ready(function () {
|
||||
$("#hold_type").on("input", function () {
|
||||
let holdType = $(this).val().replace(/^\s+/, "");
|
||||
$(this).val(holdType);
|
||||
|
||||
let reg = /^[A-Za-z]/;
|
||||
|
||||
if (!reg.test(holdType)) {
|
||||
$("#holdTypeMessage").text("Hold Type must start with a letter.").css("color", "red");
|
||||
$("#addButton").prop("disabled", true);
|
||||
return;
|
||||
} else {
|
||||
$("#holdTypeMessage").text("").css("color", "");
|
||||
$("#addButton").prop("disabled", false);
|
||||
}
|
||||
});
|
||||
|
||||
$("#holdTypeForm").on("submit", function (event) {
|
||||
event.preventDefault();
|
||||
$.post("/add_hold_type", $(this).serialize(), function (response) {
|
||||
alert(response.message);
|
||||
location.reload();
|
||||
}).fail(function (xhr) {
|
||||
alert(xhr.responseJSON.message);
|
||||
});
|
||||
});
|
||||
|
||||
$(".delete-button").on("click", function () {
|
||||
let id = $(this).data("id");
|
||||
if (confirm("Are you sure?")) {
|
||||
$.post(`/delete_hold_type/${id}`, function (response) {
|
||||
alert(response.message);
|
||||
location.reload();
|
||||
}).fail(function (xhr) {
|
||||
alert(xhr.responseJSON.message);
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
62
static/js/invoice.js
Normal file
62
static/js/invoice.js
Normal file
@@ -0,0 +1,62 @@
|
||||
// Subcontractor autocomplete functionality
|
||||
$(document).ready(function () {
|
||||
$("#subcontractor").keyup(function () {
|
||||
let query = $(this).val();
|
||||
if (query !== "") {
|
||||
$.ajax({
|
||||
url: "/search_subcontractor",
|
||||
method: "POST",
|
||||
data: { query: query },
|
||||
success: function (data) {
|
||||
$("#subcontractor_list").fadeIn().html(data);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
$("#subcontractor_list").fadeOut();
|
||||
}
|
||||
});
|
||||
|
||||
$(document).on("click", "li", function () {
|
||||
$("#subcontractor").val($(this).text());
|
||||
$("#subcontractor_id").val($(this).attr("data-id"));
|
||||
$("#subcontractor_list").fadeOut();
|
||||
});
|
||||
});
|
||||
|
||||
// Success Alert: show alert and reload after 3 seconds
|
||||
function showSuccessAlert() {
|
||||
const alertBox = document.getElementById("invoiceSuccessAlert");
|
||||
alertBox.classList.add("show");
|
||||
setTimeout(() => {
|
||||
alertBox.classList.remove("show");
|
||||
// Reload page or redirect after alert hides
|
||||
window.location.href = '/add_invoice';
|
||||
}, 3000);
|
||||
}
|
||||
|
||||
// Submit form via AJAX
|
||||
$("#invoiceForm").on("submit", function (e) {
|
||||
e.preventDefault();
|
||||
let formData = $(this).serialize();
|
||||
$.ajax({
|
||||
url: '/add_invoice',
|
||||
method: 'POST',
|
||||
data: formData,
|
||||
success: function (response) {
|
||||
if(response.status === "success") {
|
||||
showSuccessAlert();
|
||||
} else {
|
||||
alert(response.message);
|
||||
}
|
||||
},
|
||||
error: function (xhr, status, error) {
|
||||
alert("Submission failed: " + error);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
window.onload = function () {
|
||||
document.getElementById('subcontractor').focus();
|
||||
};
|
||||
39
static/js/save_data_success.js
Normal file
39
static/js/save_data_success.js
Normal file
@@ -0,0 +1,39 @@
|
||||
document.addEventListener('DOMContentLoaded', function () {
|
||||
const form = document.getElementById('saveForm');
|
||||
|
||||
form.addEventListener('submit', function (e) {
|
||||
e.preventDefault(); // Prevent normal form submission
|
||||
|
||||
const formData = new FormData(form);
|
||||
|
||||
fetch('/save_data', {
|
||||
method: 'POST',
|
||||
body: formData,
|
||||
}).then(response => response.json()).then(data => {
|
||||
if (data.success) {
|
||||
Swal.fire({
|
||||
icon: 'success',
|
||||
title: 'Success!',
|
||||
text: data.success,
|
||||
showConfirmButton: true,
|
||||
confirmButtonText: 'OK'
|
||||
}).then(() => {
|
||||
const redirectUrl = "{{ url_for('upload_excel_file') }}"; // Redirect after success pop
|
||||
});
|
||||
} else if (data.error) {
|
||||
Swal.fire({
|
||||
icon: 'error',
|
||||
title: 'Error!',
|
||||
text: data.error,
|
||||
});
|
||||
}
|
||||
}).catch(error => {
|
||||
Swal.fire({
|
||||
icon: 'error',
|
||||
title: 'Error!',
|
||||
text: 'An unexpected error occurred.',
|
||||
});
|
||||
console.error('Error:', error);
|
||||
});
|
||||
});
|
||||
});
|
||||
21
static/js/save_excel_file.js
Normal file
21
static/js/save_excel_file.js
Normal file
@@ -0,0 +1,21 @@
|
||||
$("#saveForm").on("submit", function (event) {
|
||||
event.preventDefault();
|
||||
$.ajax({
|
||||
url: "/save_data",
|
||||
type: "POST",
|
||||
data: $(this).serialize(),
|
||||
success: function (response) {
|
||||
if (response.success) {
|
||||
alert("Success: " + response.success); // Show success alert
|
||||
window.location.href = "/upload_excel_file"; // Redirect to the upload page
|
||||
}
|
||||
},
|
||||
error: function (xhr) {
|
||||
if (xhr.responseJSON && xhr.responseJSON.error) {
|
||||
alert("Error: " + xhr.responseJSON.error);
|
||||
} else {
|
||||
alert("An unexpected error occurred. Please try again.");
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
43
static/js/searchContractor.js
Normal file
43
static/js/searchContractor.js
Normal file
@@ -0,0 +1,43 @@
|
||||
$(document).ready(function () {
|
||||
function fetchResults() {
|
||||
let formData = $('#search-form').serialize();
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: '/search_contractor',
|
||||
data: formData,
|
||||
success: function (data) {
|
||||
let tableBody = $('#result-table tbody');
|
||||
tableBody.empty();
|
||||
|
||||
if (data.length === 0) {
|
||||
tableBody.append('<tr><td colspan="6">No data found</td></tr>');
|
||||
} else {
|
||||
data.forEach(function (row) {
|
||||
tableBody.append(`
|
||||
<tr>
|
||||
<td><a href="/contractor_report/${row.Contractor_Id}" target="_blank">${row.Contractor_Name}</a></td>
|
||||
<td><a href="/pmc_report/${row.PMC_No}" target="_blank">${row.PMC_No}</a></td>
|
||||
<td>${row.State_Name}</td>
|
||||
<td>${row.District_Name}</td>
|
||||
<td>${row.Block_Name}</td>
|
||||
<td>${row.Village_Name}</td>
|
||||
</tr>
|
||||
`);
|
||||
});
|
||||
}
|
||||
},
|
||||
error: function (xhr) {
|
||||
alert(xhr.responseJSON.error);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
$('#search-form input').on('keyup change', function () {
|
||||
fetchResults();
|
||||
});
|
||||
});
|
||||
|
||||
window.onload = function () {
|
||||
document.getElementById('subcontractor_name').focus();
|
||||
};
|
||||
108
static/js/search_on_table.js
Normal file
108
static/js/search_on_table.js
Normal file
@@ -0,0 +1,108 @@
|
||||
|
||||
// Search on table using search inpute options
|
||||
function searchTable() {
|
||||
let input = document.getElementById("searchBar").value.toLowerCase();
|
||||
let rows = document.querySelectorAll("table tbody tr");
|
||||
|
||||
rows.forEach(row => {
|
||||
let blockName = row.cells[1].textContent.toLowerCase();
|
||||
let districtName = row.cells[2].textContent.toLowerCase();
|
||||
let villageName = row.cells[3].textContent.toLowerCase();
|
||||
|
||||
if (blockName.includes(input) || districtName.includes(input)|| villageName.includes(input)) {
|
||||
row.style.display = "";
|
||||
} else {
|
||||
row.style.display = "none";
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// Common Sorting Script for Tables
|
||||
function sortTable(n, dir) {
|
||||
var table, rows, switching, i, x, y, shouldSwitch;
|
||||
table = document.getElementById("sortableTable"); // Ensure your table has this ID
|
||||
switching = true;
|
||||
|
||||
while (switching) {
|
||||
switching = false;
|
||||
rows = table.rows;
|
||||
|
||||
for (i = 1; i < (rows.length - 1); i++) {
|
||||
shouldSwitch = false;
|
||||
x = rows[i].getElementsByTagName("TD")[n];
|
||||
y = rows[i + 1].getElementsByTagName("TD")[n];
|
||||
|
||||
if (dir == "asc") {
|
||||
if (x.innerHTML.toLowerCase() > y.innerHTML.toLowerCase()) {
|
||||
shouldSwitch = true;
|
||||
break;
|
||||
}
|
||||
} else if (dir == "desc") {
|
||||
if (x.innerHTML.toLowerCase() < y.innerHTML.toLowerCase()) {
|
||||
shouldSwitch = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (shouldSwitch) {
|
||||
rows[i].parentNode.insertBefore(rows[i + 1], rows[i]);
|
||||
switching = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Attach sorting functionality to all sortable tables
|
||||
document.addEventListener("DOMContentLoaded", function() {
|
||||
// Find all elements with the class "sortable-header"
|
||||
var sortableHeaders = document.querySelectorAll(".sortable-header");
|
||||
|
||||
sortableHeaders.forEach(function(header) {
|
||||
// Attach click event for ascending sort
|
||||
if (header.querySelector(".sort-asc")) {
|
||||
header.querySelector(".sort-asc").addEventListener("click", function() {
|
||||
var columnIndex = Array.from(header.parentNode.children).indexOf(header);
|
||||
sortTable(columnIndex, "asc");
|
||||
});
|
||||
}
|
||||
|
||||
// Attach click event for descending sort
|
||||
if (header.querySelector(".sort-desc")) {
|
||||
header.querySelector(".sort-desc").addEventListener("click", function() {
|
||||
var columnIndex = Array.from(header.parentNode.children).indexOf(header);
|
||||
sortTable(columnIndex, "desc");
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
// ADD & Dispaly screen show
|
||||
document.addEventListener("DOMContentLoaded", function () {
|
||||
const addButton = document.getElementById("addButton");
|
||||
const displayButton = document.getElementById("displayButton");
|
||||
const addForm = document.getElementById("addForm");
|
||||
const addTable = document.getElementById("addTable");
|
||||
|
||||
// Show "Add State" form by default
|
||||
addForm.style.display = "block";
|
||||
addButton.classList.add("active-button"); // Optional: Add styling for active button
|
||||
|
||||
addButton.addEventListener("click", function () {
|
||||
addForm.style.display = "block";
|
||||
addTable.style.display = "none";
|
||||
addButton.classList.add("active-button");
|
||||
displayButton.classList.remove("active-button");
|
||||
});
|
||||
|
||||
displayButton.addEventListener("click", function () {
|
||||
addForm.style.display = "none";
|
||||
addTable.style.display = "block";
|
||||
displayButton.classList.add("active-button");
|
||||
addButton.classList.remove("active-button");
|
||||
});
|
||||
});
|
||||
8
static/js/showSuccessAlert.js
Normal file
8
static/js/showSuccessAlert.js
Normal file
@@ -0,0 +1,8 @@
|
||||
function showSuccessAlert(event) {
|
||||
event.preventDefault(); // Prevent form submission
|
||||
document.getElementById("successPopup").style.display = "block";
|
||||
setTimeout(function() {
|
||||
document.getElementById("successPopup").style.display = "none";
|
||||
event.target.submit(); // Submit the form after showing the message
|
||||
}, 2000);
|
||||
}
|
||||
66
static/js/sorting.js
Normal file
66
static/js/sorting.js
Normal file
@@ -0,0 +1,66 @@
|
||||
$(document).ready(function () {
|
||||
function fetchResults(sortBy = '', sortOrder = '') {
|
||||
let formData = $('#search-form').serialize();
|
||||
formData += &sort_by=${sortBy}&sort_order=${sortOrder};
|
||||
|
||||
$.ajax({
|
||||
type: 'POST',
|
||||
url: '/search_contractor',
|
||||
data: formData,
|
||||
success: function (data) {
|
||||
let tableBody = $('#result-table tbody');
|
||||
tableBody.empty();
|
||||
|
||||
if (data.length === 0) {
|
||||
tableBody.append('<tr><td colspan="6">No data found</td></tr>');
|
||||
} else {
|
||||
data.forEach(function (row) {
|
||||
tableBody.append(`
|
||||
<tr>
|
||||
<td><a href="/contractor_report/${row.Contractor_Id}" target="_blank">${row.Contractor_Name}</a></td>
|
||||
<td><a href="/pmc_report/${row.PMC_No}" target="_blank">${row.PMC_No}</a></td>
|
||||
<td>${row.State_Name}</td>
|
||||
<td>${row.District_Name}</td>
|
||||
<td>${row.Block_Name}</td>
|
||||
<td>${row.Village_Name}</td>
|
||||
</tr>
|
||||
`);
|
||||
});
|
||||
}
|
||||
},
|
||||
error: function (xhr) {
|
||||
alert(xhr.responseJSON.error);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
$('#search-form input').on('keyup change', function () {
|
||||
fetchResults();
|
||||
});
|
||||
|
||||
function showSortOptions(thElement, column) {
|
||||
let sortMenu = $('#sort-options');
|
||||
let offset = $(thElement).position();
|
||||
let thHeight = $(thElement).outerHeight();
|
||||
|
||||
sortMenu.html(`
|
||||
<button onclick="fetchResults('${column}', 'ASC')">Ascending</button>
|
||||
<button onclick="fetchResults('${column}', 'DESC')">Descending</button>
|
||||
`);
|
||||
|
||||
sortMenu.css({
|
||||
display: 'block',
|
||||
top: offset.top + thHeight + 'px',
|
||||
left: offset.left + 'px'
|
||||
});
|
||||
}
|
||||
|
||||
$(document).click(function(event) {
|
||||
if (!$(event.target).closest('.sort-options, th').length) {
|
||||
$('#sort-options').hide();
|
||||
}
|
||||
});
|
||||
|
||||
window.fetchResults = fetchResults;
|
||||
window.showSortOptions = showSortOptions;
|
||||
});
|
||||
61
static/js/state.js
Normal file
61
static/js/state.js
Normal file
@@ -0,0 +1,61 @@
|
||||
window.onload = function () {
|
||||
document.getElementById('state_Name').focus();
|
||||
};
|
||||
|
||||
|
||||
$(document).ready(function () {
|
||||
$("#state_Name").on("input", function () {
|
||||
let stateName = $(this).val();
|
||||
// Remove numbers and special characters automatically
|
||||
let cleanedName = stateName.replace(/[^A-Za-z ]/g, "");
|
||||
$(this).val(cleanedName);
|
||||
});
|
||||
|
||||
$("#state_Name").on("input", function () {
|
||||
let stateName = $("#state_Name").val().trim();
|
||||
|
||||
if (stateName === "") {
|
||||
$("#stateMessage").text("").css("color", "");
|
||||
$("#submitButton").prop("disabled", true);
|
||||
return;
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
url: "/check_state",
|
||||
type: "POST",
|
||||
contentType: "application/json",
|
||||
data: JSON.stringify({ state_Name: stateName }),
|
||||
success: function (response) {
|
||||
if (response.status === "available") {
|
||||
$("#stateMessage").text(response.message).css("color", "green");
|
||||
$("#submitButton").prop("disabled", false);
|
||||
}
|
||||
},
|
||||
error: function (xhr) {
|
||||
if (xhr.status === 409) {
|
||||
$("#stateMessage").text("State already exists!").css("color", "red");
|
||||
$("#submitButton").prop("disabled", true);
|
||||
} else if (xhr.status === 400) {
|
||||
$("#stateMessage").text("Invalid state name! Only letters are allowed.").css("color", "red");
|
||||
$("#submitButton").prop("disabled", true);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$("#stateForm").on("submit", function (event) {
|
||||
event.preventDefault();
|
||||
$.ajax({
|
||||
url: "/add_state",
|
||||
type: "POST",
|
||||
data: $(this).serialize(),
|
||||
success: function (response) {
|
||||
alert(response.message);
|
||||
location.reload();
|
||||
},
|
||||
error: function (xhr) {
|
||||
alert(xhr.responseJSON.message);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
49
static/js/subcontractor.js
Normal file
49
static/js/subcontractor.js
Normal file
@@ -0,0 +1,49 @@
|
||||
function validateInput() {
|
||||
let isValid = true;
|
||||
|
||||
// Get form elements
|
||||
let contractorName = document.getElementById("Contractor_Name").value;
|
||||
let mobileNo = document.getElementById("Mobile_No").value;
|
||||
let panNo = document.getElementById("PAN_No").value;
|
||||
let email = document.getElementById("Email").value;
|
||||
let passwordField = document.getElementById("Contractor_password");
|
||||
let submitBtn = document.getElementById("submitBtn");
|
||||
|
||||
// Validation patterns
|
||||
let mobileRegex = /^[0-9]{10}$/;
|
||||
let panRegex = /^[A-Z0-9]{10}$/;
|
||||
let emailRegex = /^[a-z]+@[a-z]+\.[a-z]{2,6}$/;
|
||||
|
||||
// Validate Mobile No
|
||||
if (!mobileNo.match(mobileRegex)) {
|
||||
document.getElementById("mobileError").innerText = "Mobile No must be exactly 10 digits.";
|
||||
isValid = false;
|
||||
} else {
|
||||
document.getElementById("mobileError").innerText = "";
|
||||
}
|
||||
|
||||
// Validate PAN No
|
||||
if (!panNo.match(panRegex)) {
|
||||
document.getElementById("panError").innerText = "PAN No must be uppercase letters or digits (10 chars).";
|
||||
isValid = false;
|
||||
} else {
|
||||
document.getElementById("panError").innerText = "";
|
||||
}
|
||||
|
||||
// Validate Email
|
||||
if (!email.match(emailRegex)) {
|
||||
document.getElementById("emailError").innerText = "Email must be lowercase, contain '@' and '.'";
|
||||
isValid = false;
|
||||
} else {
|
||||
document.getElementById("emailError").innerText = "";
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Enable or disable the submit button
|
||||
submitBtn.disabled = !isValid;
|
||||
}
|
||||
|
||||
window.onload = function () {
|
||||
document.getElementById('Contractor_Name').focus();
|
||||
};
|
||||
12
static/js/validateFileInput.js
Normal file
12
static/js/validateFileInput.js
Normal file
@@ -0,0 +1,12 @@
|
||||
function validateFileInput() {
|
||||
const fileInput = document.querySelector('input[type="file"]');
|
||||
const filePath = fileInput.value;
|
||||
const allowedExtensions = /(\.xlsx|\.xls)$/i;
|
||||
|
||||
if (!allowedExtensions.exec(filePath)) {
|
||||
alert("Please upload a valid Excel file (.xlsx or .xls only).");
|
||||
fileInput.value = '';
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
102
static/js/village.js
Normal file
102
static/js/village.js
Normal file
@@ -0,0 +1,102 @@
|
||||
|
||||
window.onload = function () {
|
||||
document.getElementById('Village_Name').focus();
|
||||
};
|
||||
|
||||
$(document).ready(function () {
|
||||
$('#state_Id').change(function () {
|
||||
var stateId = $(this).val();
|
||||
if (stateId) {
|
||||
$.ajax({
|
||||
url: '/get_districts/' + stateId,
|
||||
type: 'GET',
|
||||
success: function (data) {
|
||||
var districtDropdown = $('#district_Id');
|
||||
districtDropdown.empty().append('<option value="" disabled selected>Select District</option>');
|
||||
data.districts.forEach(function (district) {
|
||||
districtDropdown.append('<option value="' + district.District_id + '">' + district.District_Name + '</option>');
|
||||
});
|
||||
districtDropdown.prop('disabled', false);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$('#district_Id').change(function () {
|
||||
var districtId = $(this).val();
|
||||
if (districtId) {
|
||||
$.ajax({
|
||||
url: '/get_blocks/' + districtId,
|
||||
type: 'GET',
|
||||
success: function (data) {
|
||||
var blockDropdown = $('#block_Id');
|
||||
blockDropdown.empty().append('<option value="" disabled selected>Select Block</option>');
|
||||
data.blocks.forEach(function (block) {
|
||||
blockDropdown.append('<option value="' + block.Block_Id + '">' + block.Block_Name + '</option>');
|
||||
});
|
||||
blockDropdown.prop('disabled', false);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$('#Village_Name').on('input', function () {
|
||||
var villageName = $(this).val();
|
||||
var validPattern = /^[A-Za-z ]*$/;
|
||||
|
||||
if (!validPattern.test(villageName)) {
|
||||
$('#villageMessage').text('Only letters and spaces are allowed!').css('color', 'red');
|
||||
$('#submitVillage').prop('disabled', true);
|
||||
} else {
|
||||
$('#villageMessage').text('');
|
||||
$('#submitVillage').prop('disabled', false);
|
||||
}
|
||||
});
|
||||
|
||||
$('#Village_Name, #block_Id').on('change keyup', function () {
|
||||
var blockId = $('#block_Id').val();
|
||||
var villageName = $('#Village_Name').val().trim();
|
||||
|
||||
if (blockId && villageName) {
|
||||
$.ajax({
|
||||
url: '/check_village',
|
||||
type: 'POST',
|
||||
data: { block_Id: blockId, Village_Name: villageName },
|
||||
success: function (response) {
|
||||
if (response.status === 'exists') {
|
||||
$('#villageMessage').text(response.message).css('color', 'red');
|
||||
$('#submitVillage').prop('disabled', true);
|
||||
} else {
|
||||
$('#villageMessage').text(response.message).css('color', 'green');
|
||||
$('#submitVillage').prop('disabled', false);
|
||||
}
|
||||
},
|
||||
error: function () {
|
||||
$('#villageMessage').text('Error checking village name').css('color', 'red');
|
||||
$('#submitVillage').prop('disabled', true);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
$('#villageForm').submit(function (event) {
|
||||
event.preventDefault(); // Prevent default form submission
|
||||
|
||||
$.ajax({
|
||||
url: '/add_village',
|
||||
type: 'POST',
|
||||
data: $(this).serialize(),
|
||||
success: function (response) {
|
||||
if (response.status === 'success') {
|
||||
alert('Village added successfully!');
|
||||
location.reload(); // Refresh the page to show the updated list
|
||||
} else {
|
||||
alert('Error adding village. Please try again.');
|
||||
}
|
||||
},
|
||||
error: function () {
|
||||
alert('An error occurred. Please try again.');
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user