You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1081 lines
46 KiB
1081 lines
46 KiB
<!DOCTYPE html>
|
|
<html lang="en" xmlns:th="http://www.thymeleaf.org">
|
|
<head th:replace="~{fragments/modules/base/head :: head}"></head>
|
|
<style>
|
|
#btn_container button{
|
|
width: 20%;
|
|
}
|
|
</style>
|
|
<body>
|
|
|
|
<div class="wrapper">
|
|
<!-- header top menu Start -->
|
|
<header th:replace="~{fragments/modules/base/header :: header}"></header>
|
|
<!-- header top menu end -->
|
|
<div class="page-wrap">
|
|
<!--=============== Left Menu side Start ================-->
|
|
<div th:replace="~{fragments/modules/base/menu :: menu}"></div>
|
|
<!--=============== Left side End ================-->
|
|
<div class="main-content">
|
|
<div class="container-fluid">
|
|
|
|
<div class="page-header mb-2">
|
|
<div class="row align-items-end">
|
|
<div class="col-lg-8">
|
|
<div class="page-header-title">
|
|
<!-- <i class="far fa-calendar-plus bg-blue"></i> -->
|
|
<div class="d-inline">
|
|
<h5>Polling Personnel Updation</h5>
|
|
<span>Polling Personnel Update form</span>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="container">
|
|
|
|
<div class="row">
|
|
<div class="card" style="padding: 10px;"><span th:text="${LoginUserId}" style="display:none;" id="userIdSpan"></span>
|
|
<form id="newpollingform" enctype="multipart/form-data" >
|
|
<div class=" mb-3" style="border: 1px solid grey;padding: 10px;border-radius: 5px;">
|
|
<label class="form-label" for="slno">Unique No</label>
|
|
<input type="text" class="form-control" id="slno" readonly>
|
|
</div>
|
|
<div class=" mb-3" style="border: 1px solid grey;padding: 10px;border-radius: 5px;">
|
|
|
|
<div class="row" style="row-gap:10px;">
|
|
<div id="existing_uniquenum" style="display: none;"></div>
|
|
<div class="col-md-8 col-sm-12">
|
|
<label class="form-label" for="official_name">Name of the Official<span class="text-danger">*</span></label>
|
|
<input type="text" class="form-control" id="official_name" placeholder="Enter Full Name" required="required" pattern="[A-Za-z.\s]+" title="Only alphabets, spaces, and dots are allowed">
|
|
</div>
|
|
<div class="col-md-4 col-sm-12">
|
|
<label class="form-label" for="official_age">Age</label>
|
|
<input type="number" class="form-control" id="official_age" placeholder="Enter Age">
|
|
</div>
|
|
<div class="col-md-4 col-sm-12">
|
|
<label class="form-label d-block">Sex<span class="text-danger">*</span></label>
|
|
|
|
<div class="d-flex flex-wrap gap-3">
|
|
|
|
<div class="form-check me-3">
|
|
<input class="form-check-input" type="radio" name="gender" id="genderMale" value="M" required="required">
|
|
<label class="form-check-label pr-4" for="genderMale">Male</label>
|
|
</div>
|
|
|
|
<div class="form-check me-3">
|
|
<input class="form-check-input" type="radio" name="gender" id="genderFemale" value="F">
|
|
<label class="form-check-label pr-4" for="genderFemale">Female</label>
|
|
</div>
|
|
|
|
<div class="form-check">
|
|
<input class="form-check-input" type="radio" name="gender" id="genderTransgender" value="T">
|
|
<label class="form-check-label pr-4" for="genderTransgender">Transgender</label>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div class="col-md-4 col-sm-12" style="display: none">
|
|
<label class="form-label">Designation<span class="text-danger">*</span></label>
|
|
<select id="design_dropdown" class="form-control" required="required" readonly>
|
|
<option value="">Select</option>
|
|
</select>
|
|
</div>
|
|
|
|
<div class="col-md-4 col-sm-12">
|
|
<label class="form-label" for="pollperson_desig">Designation</label>
|
|
<input type="text" class="form-control" id="pollperson_desig" readonly>
|
|
</div>
|
|
|
|
|
|
|
|
<div class="col-md-4 col-sm-12">
|
|
<label class="form-label">Upload Photo</label>
|
|
<input type="file" class="form-control" id="profileimage" accept=".jpg,.jpeg,image/jpeg" name="profileimage">
|
|
<div id="profileimage_preview" class="mt-2" style="cursor:pointer; color:blue; text-decoration:underline;display: none;"></div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
|
|
</div>
|
|
|
|
<!--<div class="card-body mb-3" style="border: 1px solid grey;padding: 10px;border-radius: 5px;">
|
|
<div class="row" style="row-gap:10px;">
|
|
|
|
<div class="col-md-4 col-sm-12">
|
|
<label class="form-label" for="basic_pay">Basic pay</label>
|
|
<input type="text" class="form-control" id="basic_pay" readonly>
|
|
</div>
|
|
|
|
<div class="col-md-4 col-sm-12">
|
|
<label class="form-label" for="grade_pay">Grade pay</label>
|
|
<input type="text" class="form-control" id="grade_pay" readonly>
|
|
</div>
|
|
|
|
<div class="col-md-4 col-sm-12">
|
|
<label class="form-label" for="pay_band">Pay Band</label>
|
|
<input type="text" class="form-control" id="pay_band" readonly>
|
|
</div>
|
|
|
|
</div>
|
|
</div>-->
|
|
|
|
<div class="card-body" style="padding: 10px;">
|
|
<div class="row" style="row-gap:10px;">
|
|
|
|
<div class="col-md-12 col-sm-12">
|
|
<div class="card-header bg-dark text-white">
|
|
<b>Residential Details</b>
|
|
</div>
|
|
<div class="card-body" style="border: 1px solid grey;border-top-color: white;border-bottom-left-radius: 5px;border-bottom-right-radius: 5px;">
|
|
|
|
<div class="row">
|
|
<div class="col-md-4">
|
|
<label class="form-label" for="res_address1">House No/ House Name</label>
|
|
<input type="text" class="form-control mb-3" id="res_address1">
|
|
</div>
|
|
|
|
<div class="col-md-4">
|
|
<label class="form-label" for="res_address2">Street Name/ Area</label>
|
|
<input type="text" class="form-control mb-3" id="res_address2">
|
|
</div>
|
|
|
|
<div class="col-md-4">
|
|
<label class="form-label" for="res_address3">City</label>
|
|
<input type="text" class="form-control mb-3" id="res_address3">
|
|
</div>
|
|
|
|
<div class="col-md-4">
|
|
<label class="form-label" for="res_pincode">Pincode</label>
|
|
<input type="text" class="form-control mb-3" id="res_pincode">
|
|
</div>
|
|
|
|
<div class="col-md-4">
|
|
<label class="form-label" for="res_police">Nearest Police Station</label>
|
|
<input type="text" class="form-control mb-3" id="res_police">
|
|
</div>
|
|
|
|
|
|
<div class="col-md-4">
|
|
|
|
<label class="form-label" for="res_phoneno">Phone No</label>
|
|
<div class="d-flex justify-content-start">
|
|
<button class="btn btn-secondary" disabled="disabled" style="height: fit-content">STD</button>
|
|
<input type="text" class="form-control mb-3 mx-2" id="res_phoneno">
|
|
</div>
|
|
|
|
</div>
|
|
<div class="col-md-4">
|
|
<label class="form-label" for="res_mobile">Mobile</label>
|
|
<input type="text" class="form-control mb-3" id="res_mobile">
|
|
|
|
</div>
|
|
<div class="col-md-4">
|
|
<div class="mb-3">
|
|
<label class="form-label" for="nativetaluk_dropdown">Native Taluk/District</label>
|
|
<select id="nativetaluk_dropdown" class="form-control mb-3">
|
|
<option value="">Select</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="mb-3">
|
|
<label class="form-label" for="nativeassembly_dropdown">Native Assembly Constituency</label>
|
|
<select id="nativeassembly_dropdown" class="form-control mb-3">
|
|
<option value="">Select</option>
|
|
</select>
|
|
</div>
|
|
|
|
|
|
<div class="col-md-4">
|
|
<label class="form-label" for="residentialassembly_dropdown">Residential Assembly Constituency</label>
|
|
<select id="residentialassembly_dropdown" class="form-control mb-3">
|
|
<option value="">Select</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div class="card-body mb-3" style="padding: 10px;">
|
|
<div style="border: 1px solid grey;border-radius: 5px;">
|
|
<div class="row" style="row-gap:10px;">
|
|
<div class="col-md-12 col-sm-12">
|
|
<div class="card-header">
|
|
<b>Enrolled Details</b>
|
|
</div>
|
|
<div class="card-body">
|
|
|
|
<div class="row pl-3 pb-2" style="row-gap:10px;">
|
|
<span id="epic_verify_link" style="cursor:pointer; color:blue; text-decoration:underline;">
|
|
Click here to verify EPIC No <i class="ik ik-external-link"></i>
|
|
</span>
|
|
</div>
|
|
<div class="row" style="row-gap:10px;">
|
|
|
|
|
|
|
|
<div class="col-md-6 col-sm-12">
|
|
<label class="form-label" for="epic_no">EPIC No</label>
|
|
<input type="text" class="form-control" id="epic_no">
|
|
</div>
|
|
|
|
<div class="col-md-6 col-sm-12">
|
|
<label class="form-label" for="epic_name">Name</label>
|
|
<input type="text" class="form-control" id="epic_name" readonly="readonly">
|
|
</div>
|
|
|
|
<div class="col-md-6 col-sm-12">
|
|
<label class="form-label" for="enrolledassembly_dropdown">Enrolled Assembly Constituency</label>
|
|
<select id="enrolledassembly_dropdown" class="form-control">
|
|
<option value="">Select</option>
|
|
</select>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="row mt-2" style="row-gap:10px;">
|
|
<div class="col-md-6 col-sm-12">
|
|
<label class="form-label" for="part_no">Part No</label>
|
|
<input type="text" class="form-control" id="part_no">
|
|
</div>
|
|
<div class="col-md-6 col-sm-12">
|
|
<label class="form-label" for="si_no">SI. No</label>
|
|
<input type="text" class="form-control" id="si_no">
|
|
</div>
|
|
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card-body" style="padding: 10px;">
|
|
<div class="row" id="btn_container">
|
|
<div class="col-12 d-flex justify-content-center">
|
|
<button type="button" class="btn btn-secondary mx-2" onclick="goback()">Back</button>
|
|
<button type="submit" class="btn btn-primary mx-2" id="saveBtn">Update</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div class="modal fade" id="profileImageModal" tabindex="-1">
|
|
<div class="modal-dialog">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title">Profile Photo</h5>
|
|
|
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
|
<span aria-hidden="true">×</span>
|
|
</button>
|
|
</div>
|
|
<div class="modal-body text-center">
|
|
<img id="modal_profile_image" src="" class="img-fluid rounded" style="max-height:400px;" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<div id="pageLoader" style="display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(255, 255, 255, 0.8); z-index: 9999; text-align: center;">
|
|
<div style="position: relative; top: 50%; transform: translateY(-50%);">
|
|
<div class="spinner-border text-primary" role="status" style="width: 3rem; height: 3rem;">
|
|
<span class="sr-only">Loading...</span>
|
|
</div>
|
|
<!-- Add the 'Please wait' text below the spinner -->
|
|
<p style="margin-top: 1rem; font-size: 1.2rem; color: #007bff;">Please wait...</p>
|
|
</div>
|
|
</div>
|
|
|
|
<div th:replace="~{fragments/modules/base/app_module_menu_box :: div}"></div>
|
|
|
|
<footer th:replace="~{fragments/modules/base/footer :: footer}"></footer>
|
|
</div>
|
|
</div>
|
|
|
|
<script th:replace="~{fragments/modules/base/script :: script}"></script>
|
|
<script type="text/javascript">
|
|
|
|
$(document).ready(function() {
|
|
|
|
let slno = sessionStorage.getItem("slno");
|
|
|
|
console.log("slno from sessionStorage:", slno);
|
|
|
|
if (!slno ) {
|
|
window.location.href = "/election/update_pollingperson/update";
|
|
}
|
|
|
|
document.getElementById("slno").value = slno;
|
|
|
|
// ❗ Remove values IMMEDIATELY so refresh loses them
|
|
|
|
sessionStorage.removeItem("slno");
|
|
|
|
let designationDropdown = document.getElementById('design_dropdown');
|
|
|
|
fetch('/election/api/dataentry/batch/getAllDesignations')
|
|
.then(response => response.json())
|
|
.then(result => {
|
|
|
|
if (result.status !== "success") {
|
|
console.error("API error:", result.message);
|
|
return;
|
|
}
|
|
|
|
let list = result.data;
|
|
|
|
// Clear existing options
|
|
designationDropdown.innerHTML = `<option value="">Select</option>`;
|
|
|
|
// Add options from the API response
|
|
list.forEach(design => {
|
|
designationDropdown.innerHTML += `
|
|
<option value="${design.new_designation}">
|
|
${design.new_designation}
|
|
</option>`;
|
|
});
|
|
|
|
// ⭐ Activate Select2 after options added
|
|
$('#design_dropdown').select2({
|
|
placeholder: "Search designation...",
|
|
allowClear: true,
|
|
width: "100%"
|
|
});
|
|
|
|
getPollingDetails(slno);
|
|
|
|
$('#design_dropdown').on('change', function () {
|
|
let selectedDesgId = $(this).val();
|
|
|
|
if (selectedDesgId) {
|
|
console.log("selectedDesgId",selectedDesgId)
|
|
getDesignationDetails(selectedDesgId);
|
|
}
|
|
else{
|
|
document.getElementById("basic_pay").value = "";
|
|
document.getElementById("grade_pay").value = "";
|
|
document.getElementById("pay_band").value = "";
|
|
}
|
|
});
|
|
|
|
|
|
|
|
})
|
|
.catch(error => {
|
|
console.error('Error fetching designation:', error);
|
|
});
|
|
|
|
let NativeTaulkDropdown = document.getElementById('nativetaluk_dropdown');
|
|
|
|
fetch('/election/api/dataentry/batch/getAllDistricts')
|
|
.then(response => response.json())
|
|
.then(result => {
|
|
|
|
if (result.status !== "success") {
|
|
console.error("API error:", result.message);
|
|
return;
|
|
}
|
|
|
|
let list = result.data;
|
|
|
|
NativeTaulkDropdown.innerHTML = `<option value="">Select</option>`;
|
|
|
|
// Add options from the API response
|
|
list.forEach(nativedis => {
|
|
NativeTaulkDropdown.innerHTML += `
|
|
<option value="${nativedis.dist_no}">
|
|
${nativedis.dist_name}
|
|
</option>`;
|
|
});
|
|
|
|
$('#nativetaluk_dropdown').select2({
|
|
placeholder: "Search",
|
|
allowClear: true,
|
|
width: "100%"
|
|
});
|
|
|
|
if (window.editHomeDist) {
|
|
$('#nativetaluk_dropdown').val(window.editHomeDist).trigger('change');
|
|
}
|
|
|
|
})
|
|
.catch(error => {
|
|
console.error('Error fetching in District :', error);
|
|
});
|
|
|
|
|
|
let NativeAcDropdown = document.getElementById('nativeassembly_dropdown');
|
|
let ResiAcDropdown = document.getElementById('residentialassembly_dropdown');
|
|
let EnrollAsDropdown = document.getElementById('enrolledassembly_dropdown');
|
|
|
|
function loadOptions(dropdown, list) {
|
|
dropdown.innerHTML = `<option value="">Select</option>`;
|
|
list.forEach(item => {
|
|
dropdown.innerHTML += `
|
|
<option value="${item.ac_no}">
|
|
${item.ac_name}
|
|
</option>`;
|
|
});
|
|
}
|
|
|
|
fetch('/election/api/dataentry/batch/getAllAclist')
|
|
.then(response => response.json())
|
|
.then(result => {
|
|
|
|
if (result.status !== "success") {
|
|
console.error("API error:", result.message);
|
|
return;
|
|
}
|
|
|
|
let list = result.data;
|
|
|
|
// Load all three dropdowns using same function
|
|
loadOptions(NativeAcDropdown, list);
|
|
loadOptions(ResiAcDropdown, list);
|
|
loadOptions(EnrollAsDropdown, list);
|
|
|
|
|
|
$('#nativeassembly_dropdown, #residentialassembly_dropdown, #enrolledassembly_dropdown').select2({
|
|
placeholder: "Search",
|
|
allowClear: true,
|
|
width: "100%"
|
|
});
|
|
|
|
// PRESELECT VALUES (ONLY IF NOT NULL)
|
|
if (window.nativeAcNo) {
|
|
$('#nativeassembly_dropdown').val(window.nativeAcNo).trigger('change');
|
|
}
|
|
if (window.resideAcNo) {
|
|
$('#residentialassembly_dropdown').val(window.resideAcNo).trigger('change');
|
|
}
|
|
if (window.enrollAcNo) {
|
|
$('#enrolledassembly_dropdown').val(window.enrollAcNo).trigger('change');
|
|
}
|
|
|
|
})
|
|
.catch(error => {
|
|
console.error('Error fetching Assembly Constituency:', error);
|
|
});
|
|
|
|
|
|
|
|
|
|
document.getElementById("official_name").addEventListener("input", function () {
|
|
document.getElementById("epic_name").value = this.value;
|
|
});
|
|
|
|
document.getElementById("epic_verify_link").addEventListener("click", function () {
|
|
window.open("https://electoralsearch.eci.gov.in/", "_blank");
|
|
});
|
|
|
|
// getOfficeDetails(officeId);
|
|
|
|
// getPollingDetails(slno);
|
|
|
|
$('#profileimage').on('input', function () {
|
|
|
|
let fileInput = this;
|
|
let file = fileInput.files[0];
|
|
|
|
// Allowed extensions
|
|
let allowedExtensions = /(\.jpg|\.jpeg)$/i;
|
|
|
|
// File name
|
|
let fileName = file.name;
|
|
|
|
// File size (10 MB = 10 * 1024 * 1024)
|
|
let maxSize = 10 * 1024 * 1024;
|
|
|
|
// 1) Validate extension
|
|
if (!allowedExtensions.test(fileName)) {
|
|
Swal.fire({
|
|
icon: 'error',
|
|
title: 'Invalid File Type',
|
|
text: 'Only JPG / JPEG images are allowed!'
|
|
});
|
|
fileInput.value = ""; // Reset file
|
|
|
|
return;
|
|
}
|
|
|
|
// 2) Validate MIME type
|
|
if (file.type !== "image/jpeg") {
|
|
Swal.fire({
|
|
icon: 'error',
|
|
title: 'Invalid Image Format',
|
|
text: 'Only JPEG images are allowed!'
|
|
});
|
|
fileInput.value = "";
|
|
|
|
return;
|
|
}
|
|
|
|
// 3) Validate size
|
|
if (file.size > maxSize) {
|
|
Swal.fire({
|
|
icon: 'error',
|
|
title: 'File Too Large',
|
|
text: 'File size must be 10 MB or less!'
|
|
});
|
|
fileInput.value = "";
|
|
|
|
return;
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
$('#res_pincode').on('input', function () {
|
|
// Remove anything that is not a digit
|
|
this.value = this.value.replace(/\D/g, '');
|
|
|
|
// Limit to max 6 digits
|
|
if (this.value.length > 6) {
|
|
this.value = this.value.slice(0, 6);
|
|
}
|
|
});
|
|
|
|
// PHONE NO: 8 to 10 digits
|
|
$('#res_phoneno').on('input', function () {
|
|
// Allow only digits
|
|
this.value = this.value.replace(/\D/g, '');
|
|
|
|
// Max 10 digits
|
|
if (this.value.length > 10) {
|
|
this.value = this.value.slice(0, 10);
|
|
}
|
|
});
|
|
|
|
// MOBILE NO: exactly 10 digits
|
|
$('#res_mobile').on('input', function () {
|
|
// Allow only digits
|
|
this.value = this.value.replace(/\D/g, '');
|
|
|
|
// Max 10 digits
|
|
if (this.value.length > 10) {
|
|
this.value = this.value.slice(0, 10);
|
|
}
|
|
});
|
|
|
|
// PART NO: 6 digits only
|
|
$('#part_no').on('input', function () {
|
|
this.value = this.value.replace(/\D/g, ''); // allow digits only
|
|
|
|
if (this.value.length > 6) {
|
|
this.value = this.value.slice(0, 6); // max 6 digits
|
|
}
|
|
});
|
|
|
|
// SI NO: 6 digits only
|
|
$('#si_no').on('input', function () {
|
|
this.value = this.value.replace(/\D/g, ''); // allow digits only
|
|
|
|
if (this.value.length > 6) {
|
|
this.value = this.value.slice(0, 6); // max 6 digits
|
|
}
|
|
});
|
|
|
|
$('#epic_no').on('input', function () {
|
|
// Allow only A–Z, a–z, 0–9
|
|
this.value = this.value.replace(/[^A-Za-z0-9]/g, '');
|
|
|
|
// Limit to 16 characters
|
|
if (this.value.length > 16) {
|
|
this.value = this.value.slice(0, 16);
|
|
}
|
|
});
|
|
|
|
|
|
|
|
|
|
$('#newpollingform').submit(function (e) {
|
|
e.preventDefault();
|
|
|
|
let formData = new FormData(this);
|
|
$('#saveBtn').prop('disabled', true).text('Updating...');
|
|
$('#pageLoader').show();
|
|
function setIfPresent(formData, key, value) {
|
|
if (value !== undefined && value !== null && value !== "") {
|
|
formData.set(key, value);
|
|
}
|
|
}
|
|
function setFileIfPresent(formData, key, fileInput) {
|
|
if (fileInput && fileInput.files && fileInput.files.length > 0) {
|
|
formData.set(key, fileInput.files[0]);
|
|
}
|
|
}
|
|
|
|
let userId = document.getElementById('userIdSpan').textContent;
|
|
// let batch_no = $('#batch_no').val().trim();
|
|
let official_name = $('#official_name').val().trim();
|
|
let official_age = $('#official_age').val().trim();
|
|
|
|
// Convert to number
|
|
let ageNum = parseInt(official_age, 10);
|
|
|
|
// Validate age
|
|
if(official_age){
|
|
if (isNaN(ageNum) || ageNum < 18 || ageNum > 65) {
|
|
$('#pageLoader').hide();
|
|
$('#saveBtn').prop('disabled', false).text('Update');
|
|
Swal.fire({
|
|
icon: 'warning',
|
|
title: 'Invalid Age',
|
|
text: 'Age must be between 18 and 65'
|
|
});
|
|
|
|
return;
|
|
}
|
|
}
|
|
|
|
let gender = $("input[name='gender']:checked").val();
|
|
// let design_id=$('#design_dropdown').val();
|
|
// let design_name = $('#design_dropdown').val();
|
|
let design_name = $('#pollperson_desig').val().trim();
|
|
|
|
|
|
let respincode=$('#res_pincode').val().trim();
|
|
|
|
if(respincode){
|
|
// Rule 1: Must be exactly 6 digits & should NOT start with 0
|
|
if (!/^[1-9][0-9]{5}$/.test(respincode)) {
|
|
$('#pageLoader').hide();
|
|
$('#saveBtn').prop('disabled', false).text('Update');
|
|
Swal.fire({
|
|
icon: 'warning',
|
|
title: 'Invalid Pincode',
|
|
text: 'Pincode must be 6 digits and cannot start with 0.'
|
|
});
|
|
return;
|
|
}
|
|
|
|
// Rule 2: Reject 123456 (sequential)
|
|
if (respincode === "123456") {
|
|
$('#pageLoader').hide();
|
|
$('#saveBtn').prop('disabled', false).text('Update');
|
|
Swal.fire({
|
|
icon: 'warning',
|
|
title: 'Invalid Pincode',
|
|
text: 'Sequential numbers like 123456 are not allowed.'
|
|
});
|
|
return;
|
|
}
|
|
|
|
// Rule 3: Reject all digits same (111111, 222222, etc.)
|
|
if (/^(\d)\1{5}$/.test(respincode)) {
|
|
$('#pageLoader').hide();
|
|
$('#saveBtn').prop('disabled', false).text('Update');
|
|
Swal.fire({
|
|
icon: 'warning',
|
|
title: 'Invalid Pincode',
|
|
text: 'All digits cannot be the same.'
|
|
});
|
|
return;
|
|
}
|
|
}
|
|
|
|
let phnumber=$('#res_phoneno').val().trim();
|
|
|
|
if(phnumber){
|
|
// Validate 8 to 10 digits only
|
|
if (!/^\d{8,10}$/.test(phnumber)) {
|
|
$('#pageLoader').hide();
|
|
$('#saveBtn').prop('disabled', false).text('Update');
|
|
Swal.fire({
|
|
icon: 'warning',
|
|
title: 'Invalid Phone Number',
|
|
text: 'Phone number must be 8 to 10 digits.'
|
|
});
|
|
return;
|
|
}
|
|
}
|
|
|
|
let mobnumber=$('#res_mobile').val().trim();
|
|
|
|
if(mobnumber){
|
|
// Rule 1: Must be exactly 10 digits & must not start with 0
|
|
if (!/^[1-9][0-9]{9}$/.test(mobnumber)) {
|
|
$('#pageLoader').hide();
|
|
$('#saveBtn').prop('disabled', false).text('Update');
|
|
Swal.fire({
|
|
icon: 'warning',
|
|
title: 'Invalid Mobile Number',
|
|
text: 'Mobile number must be 10 digits and cannot start with 0.'
|
|
});
|
|
return;
|
|
}
|
|
|
|
// Rule 2: Reject sequential numbers like 1234567890
|
|
if (mobnumber === "1234567890") {
|
|
$('#pageLoader').hide();
|
|
$('#saveBtn').prop('disabled', false).text('Update');
|
|
Swal.fire({
|
|
icon: 'warning',
|
|
title: 'Invalid Mobile Number',
|
|
text: 'Sequential numbers like 1234567890 are not allowed.'
|
|
});
|
|
return;
|
|
}
|
|
|
|
// Rule 3: Reject all digits same (1111111111, 2222222222, etc.)
|
|
if (/^(\d)\1{9}$/.test(mobnumber)) {
|
|
$('#pageLoader').hide();
|
|
$('#saveBtn').prop('disabled', false).text('Update');
|
|
Swal.fire({
|
|
|
|
icon: 'warning',
|
|
title: 'Invalid Mobile Number',
|
|
text: 'All digits cannot be the same.'
|
|
});
|
|
return;
|
|
}
|
|
}
|
|
|
|
let native_taluk=$('#nativetaluk_dropdown').val();
|
|
let native_ac=$('#nativeassembly_dropdown').val();
|
|
let res_ac=$('#residentialassembly_dropdown').val();
|
|
let enrol_ac=$('#enrolledassembly_dropdown').val();
|
|
let epic_no = $('#epic_no').val().trim();
|
|
|
|
if(epic_no){
|
|
// Allow only 8 to 16 alphanumeric characters
|
|
let epicPattern = /^[A-Za-z0-9]{8,16}$/;
|
|
|
|
if (!epicPattern.test(epic_no)) {
|
|
$('#pageLoader').hide();
|
|
$('#saveBtn').prop('disabled', false).text('Save');
|
|
|
|
Swal.fire({
|
|
icon: 'warning',
|
|
title: 'Invalid EPIC Number',
|
|
text: 'EPIC number must be 8 to 16 alphanumeric characters.'
|
|
});
|
|
return;
|
|
}
|
|
}
|
|
|
|
let part_no =$('#part_no').val().trim();
|
|
let si_no = $('#si_no').val().trim();
|
|
|
|
if(part_no){
|
|
// Validate part_no
|
|
if (part_no.length > 6) {
|
|
$('#pageLoader').hide();
|
|
$('#saveBtn').prop('disabled', false).text('Save');
|
|
Swal.fire({
|
|
icon: 'warning',
|
|
title: 'Invalid Part No',
|
|
text: 'Maximum 6 digits allowed for Part No.'
|
|
});
|
|
return;
|
|
}
|
|
}
|
|
|
|
if(si_no){
|
|
// Validate si_no
|
|
if (si_no.length > 6) {
|
|
$('#pageLoader').hide();
|
|
$('#saveBtn').prop('disabled', false).text('Save');
|
|
Swal.fire({
|
|
icon: 'warning',
|
|
title: 'Invalid Sl. No',
|
|
text: 'Maximum 6 digits allowed for Sl No.'
|
|
});
|
|
return;
|
|
}
|
|
}
|
|
|
|
|
|
setFileIfPresent(formData, "pp_image", $('#profileimage')[0]);
|
|
|
|
formData.append("userid", userId);
|
|
let existing_uniquenum = $('#existing_uniquenum').text();
|
|
formData.append("slno", existing_uniquenum);
|
|
|
|
setIfPresent(formData, "pName", official_name);
|
|
setIfPresent(formData, "pAge", official_age);
|
|
setIfPresent(formData, "pGender", gender || "");
|
|
setIfPresent(formData, "Designation", design_name);
|
|
// setIfPresent(formData, "Designation", design_name);
|
|
setIfPresent(formData, "address1", $('#res_address1').val().trim());
|
|
setIfPresent(formData, "address2", $('#res_address2').val().trim());
|
|
|
|
setIfPresent(formData, "address3", $('#res_address3').val().trim());
|
|
setIfPresent(formData, "pincode",respincode);
|
|
setIfPresent(formData, "policest", $('#res_police').val().trim());
|
|
setIfPresent(formData, "phoneno",phnumber);
|
|
setIfPresent(formData, "mobileno",mobnumber);
|
|
setIfPresent(formData, "district",native_taluk);
|
|
setIfPresent(formData, "nativeac",native_ac);
|
|
setIfPresent(formData, "resideac",res_ac);
|
|
setIfPresent(formData, "electoracno",enrol_ac);
|
|
setIfPresent(formData, "electorpartno",part_no );
|
|
|
|
setIfPresent(formData, "electorslno", si_no);
|
|
setIfPresent(formData, "epicno",epic_no);
|
|
|
|
setIfPresent(formData,"slno",slno);
|
|
|
|
|
|
$.ajax({
|
|
url: '/election/api/updatepollperson/updateppdetailsbyid',
|
|
type: 'POST',
|
|
data: formData,
|
|
enctype: 'multipart/form-data',
|
|
processData: false,
|
|
contentType: false,
|
|
success: function (response) {
|
|
$('#pageLoader').hide();
|
|
if (response.status) {
|
|
Swal.fire({
|
|
allowOutsideClick: false,
|
|
allowEscapeKey: false,
|
|
allowEnterKey: false,
|
|
icon: 'success',
|
|
title: 'Success',
|
|
text:response.description
|
|
|
|
}).then((result) => {
|
|
window.location.href="/election/update_pollingperson/update";
|
|
});
|
|
|
|
} else {
|
|
$('#pageLoader').hide();
|
|
Swal.fire({
|
|
icon: 'warning',
|
|
title: 'Update Failed',
|
|
text: response.description || 'Something went wrong!'
|
|
});
|
|
}
|
|
$('#saveBtn').prop('disabled', false).text('Update');
|
|
},
|
|
error: function () {
|
|
$('#pageLoader').hide();
|
|
Swal.fire({
|
|
icon: 'error',
|
|
title: 'Submission Error',
|
|
text: 'Something went wrong while submitting the form.'
|
|
});
|
|
$('#saveBtn').prop('disabled', false).text('Update');
|
|
}
|
|
});
|
|
|
|
});
|
|
|
|
|
|
});
|
|
|
|
|
|
function getDesignationDetails(desgId) {
|
|
|
|
|
|
fetch('/election/api/updatepollperson/getPayDetailsByDesig?DesgName=' + desgId)
|
|
.then(response => response.json())
|
|
.then(result => {
|
|
|
|
if (result.status !== "success") {
|
|
console.error("API error:", result.message);
|
|
return;
|
|
}
|
|
|
|
let data = result.data; // your pay details row
|
|
|
|
//console.log("Designation Pay Details:", data);
|
|
|
|
// Example: set values into input fields
|
|
document.getElementById("basic_pay").value = data.basic_pay;
|
|
document.getElementById("grade_pay").value = data.grade_pay;
|
|
document.getElementById("pay_band").value = data.pay_scale;
|
|
|
|
})
|
|
.catch(error => {
|
|
console.error("Error fetching pay details:", error);
|
|
});
|
|
}
|
|
|
|
function getOfficeDetails(officeId) {
|
|
console.log("officeId="+officeId);
|
|
|
|
fetch('/election/api/dataentry/batch/getOfficeDetailsById?officeId=' + officeId)
|
|
.then(response => response.json())
|
|
.then(result => {
|
|
|
|
if (result.status !== "success") {
|
|
console.error("API error:", result.message);
|
|
return;
|
|
}
|
|
|
|
let data = result.data[0];
|
|
console.log("office Details:", data);
|
|
|
|
// Example: set values into input fields
|
|
document.getElementById("off_office_name").value = data.office_name;
|
|
document.getElementById("off_address1").value = data.address1;
|
|
document.getElementById("off_address2").value = data.address2;
|
|
document.getElementById("off_address3").value = data.address3;
|
|
document.getElementById("off_pincode").value = data.pincode;
|
|
document.getElementById("off_phoneno").value = data.phone_no;
|
|
document.getElementById("off_taluk").value = data.taluk_name;
|
|
document.getElementById("off_govt_type").value = data.govt_type;
|
|
document.getElementById("off_pub_sec").value = data.public_sector;
|
|
document.getElementById("off_localbody").value = data.local_body;
|
|
document.getElementById("off_edu_ins").value = data.edu_institution;
|
|
document.getElementById("off_category").value = data.office_category;
|
|
document.getElementById("off_assembly").value = data.office_assembly;
|
|
|
|
})
|
|
.catch(error => {
|
|
console.error("Error fetching Office details:", error);
|
|
});
|
|
}
|
|
|
|
function getPollingDetails(slno){
|
|
$('#pageLoader').show();
|
|
console.log("slno="+slno);
|
|
|
|
fetch('/election/api/updatepollperson/getPollingDetailsById?slno=' + slno)
|
|
.then(response => response.json())
|
|
.then(result => {
|
|
|
|
if (result.status !== "success") {
|
|
console.error("API error:", result.message);
|
|
return;
|
|
}
|
|
|
|
let data = result.data[0];
|
|
console.log("Polling Personnel Details:", data);
|
|
// window.editDesignationId = data.designation;
|
|
window.editDesignationId = data.designation ? data.designation.trim() : "";
|
|
window.editHomeDist = data.home_dist;
|
|
window.nativeAcNo = data.native_ac_no;
|
|
window.resideAcNo = data.reside_ac_no;
|
|
window.enrollAcNo = data.elector_ac_no;
|
|
|
|
// Example: set values into input fields
|
|
document.getElementById("official_name").value = data.name;
|
|
document.getElementById("epic_name").value = data.name;
|
|
document.getElementById("official_age").value = data.age;
|
|
document.getElementById("pollperson_desig").value=data.designation;
|
|
if (data.sex) {
|
|
let genderValue = data.sex; // M / F / T
|
|
const radio = document.querySelector(`input[name="gender"][value="${genderValue}"]`);
|
|
if (radio) radio.checked = true;
|
|
}
|
|
|
|
$('#existing_uniquenum').text(data.slno);
|
|
|
|
document.getElementById("res_address1").value = data.r_address1;
|
|
document.getElementById("res_address2").value = data.r_address2;
|
|
document.getElementById("res_address3").value = data.r_address3;
|
|
document.getElementById("res_pincode").value = data.r_pincode;
|
|
document.getElementById("res_police").value = data.r_policest;
|
|
document.getElementById("res_phoneno").value = data.r_phone_no;
|
|
document.getElementById("res_mobile").value = data.r_mobile_no;
|
|
if (window.editHomeDist) {
|
|
$('#nativetaluk_dropdown').val(window.editHomeDist).trigger('change');
|
|
}
|
|
if (window.nativeAcNo) {
|
|
$('#nativeassembly_dropdown').val(window.nativeAcNo).trigger('change');
|
|
}
|
|
if (window.resideAcNo) {
|
|
$('#residentialassembly_dropdown').val(window.resideAcNo).trigger('change');
|
|
}
|
|
if (window.enrollAcNo) {
|
|
$('#enrolledassembly_dropdown').val(window.enrollAcNo).trigger('change');
|
|
}
|
|
|
|
|
|
if (window.editDesignationId) {
|
|
$('#design_dropdown')
|
|
.val(window.editDesignationId)
|
|
.trigger('change');
|
|
}
|
|
document.getElementById("epic_no").value = data.epic_no;
|
|
document.getElementById("part_no").value = data.elector_part_no;
|
|
document.getElementById("si_no").value = data.elector_sl_no;
|
|
|
|
if (data.img_full_path) {
|
|
|
|
let url = data.img_full_path;
|
|
|
|
// Extract full file name (e.g., profile_img_02122025195649_newuser.jpg)
|
|
let fullName = url.substring(url.lastIndexOf("/") + 1);
|
|
|
|
// Extract only the part after the last underscore → newuser.jpg
|
|
let filename = fullName.includes("_")
|
|
? fullName.substring(fullName.lastIndexOf("_") + 1)
|
|
: fullName;
|
|
|
|
$("#profileimage_preview")
|
|
.text(filename)
|
|
.show()
|
|
.off("click")
|
|
.on("click", function () {
|
|
$("#modal_profile_image").attr("src", url);
|
|
|
|
let modal = new bootstrap.Modal(
|
|
document.getElementById('profileImageModal')
|
|
);
|
|
modal.show();
|
|
});
|
|
} else {
|
|
$("#profileimage_preview").hide().text('');
|
|
}
|
|
|
|
|
|
|
|
})
|
|
.catch(error => {
|
|
console.error("Error fetching Office details:", error);
|
|
})
|
|
.finally(() => {
|
|
$('#pageLoader').hide(); // ALWAYS hide loader
|
|
});
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function goback(){
|
|
|
|
//window.location.href="/election/dataentry/batches";
|
|
window.history.back();
|
|
}
|
|
|
|
|
|
window.onload = function () {
|
|
if (performance.getEntriesByType("navigation")[0].type === "reload") {
|
|
goback();
|
|
}
|
|
};
|
|
|
|
|
|
|
|
</script>
|
|
</body>
|
|
</html>
|