Browse Source

Clean and safe message template added

main
kanimozhi 8 months ago
parent
commit
d61a07540f
  1. 357
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/vendor/controller/CreateEventAPIController.java
  2. 1115
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/vendor/service/createventService.java
  3. 25
      gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/vtrack/service/VehicleService.java
  4. 506
      gcc_officer_portal/src/main/resources/templates/modules/vendors/EventList.html
  5. 614
      gcc_officer_portal/src/main/resources/templates/modules/vendors/RequestList.html
  6. 2459
      gcc_officer_portal/src/main/resources/templates/modules/vendors/streetVendorRequestForm.html

357
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/vendor/controller/CreateEventAPIController.java

@ -32,186 +32,181 @@ import in.gov.chennaicorporation.gccoffice.vendor.service.StreetVendorService;
@RestController
public class CreateEventAPIController {
@Autowired
private createventService createventservices;
@Autowired
private StreetVendorService StreetVendorService;
// @Autowired
// private Environment environment;
@PostMapping("/save")
public ResponseEntity<Map<String, Object>> saveEventWithFile(
@RequestParam("eventName") String eventName,
@RequestParam("eventDate") String eventDateStr,
@RequestParam("file") MultipartFile file,
@RequestParam("cby") String cby) {
Map<String, Object> response = new HashMap<>();
try {
if (file == null || file.isEmpty()) {
response.put("status", false);
response.put("message", "failed");
response.put("description", "File is required");
return ResponseEntity.badRequest().body(response);
}
if (eventName == null || eventName.trim().isEmpty()) {
response.put("status", false);
response.put("message", "failed");
response.put("description", "Event name cannot be empty");
return ResponseEntity.badRequest().body(response);
}
LocalDate eventDate;
try {
eventDate = LocalDate.parse(eventDateStr);
} catch (Exception ex) {
response.put("status", false);
response.put("message", "failed");
response.put("description", "Invalid date format (use yyyy-MM-dd)");
return ResponseEntity.badRequest().body(response);
}
String eventFilePath = StreetVendorService.fileUpload(file, "event_file");
if (eventFilePath == null) {
response.put("status", false);
response.put("message", "failed");
response.put("description", "File upload failed");
return ResponseEntity.internalServerError().body(response);
}
String saveStatus = createventservices.insertEvent(eventName, eventDate, eventFilePath, cby);
if (saveStatus == null || saveStatus.equalsIgnoreCase("error")) {
response.put("status", false);
response.put("message", "failed");
response.put("description", "Failed to save event details");
return ResponseEntity.internalServerError().body(response);
}
response.put("status", true);
response.put("message", "success");
response.put("description", "Details saved successfully");
return ResponseEntity.ok(response);
} catch (Exception e) {
e.printStackTrace();
response.put("status", false);
response.put("message", "failed");
response.put("description", "Internal server error: " + e.getMessage());
return ResponseEntity.internalServerError().body(response);
}
}
//save file and get path
// private String saveFile(MultipartFile file) throws IOException {
//
// String uploadDirectory = environment.getProperty("file.upload.directory");
//
// String folderName = environment.getProperty("vending.foldername");
//
// String fileName = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss")) + "_" + file.getOriginalFilename();
//
// String folderPath = uploadDirectory + "/" + folderName + "/";
//
//
// Path dirPath = Paths.get(folderPath);
// if (!Files.exists(dirPath)) {
// Files.createDirectories(dirPath);
// }
//
// Path filePath = dirPath.resolve(fileName);
//
// Files.write(filePath, file.getBytes());
//
// return filePath.toAbsolutePath().toString();
// }
@GetMapping("/dropdown-Event")
public ResponseEntity<List<Map<String, Object>>> ViewDropdownEvent() {
try {
List<Map<String, Object>> result = createventservices.ViewDropdownEvent();
return ResponseEntity.ok(result);
} catch (Exception e) {
Map<String, Object> error = new HashMap<>();
error.put("error", "Unable to fetch event list");
error.put("details", e.getMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(Collections.singletonList(error));
}
}
@GetMapping("/committedropdown")
public List<Map<String, Object>> ViewCommitteeDropdownEvent() {
return createventservices.ViewCommitteeDropdownEvent();
}
@GetMapping("/getreports")
public List<Map<String, Object>> getreports(
@RequestParam(required = false) String meeting,
@RequestParam(required = false) String status,
@RequestParam(required = false) String zone,
@RequestParam(required = false) String ward,
@RequestParam String userId) {
List<Map<String, Object>> streetdb = StreetVendorService.getdataforreport(zone,ward); // BASE LIST
List<Map<String, Object>> vendingdb = createventservices.getdataforreport(meeting, status,userId); // FILTERED REQUEST LIST
// Convert vendingdb to map: vdid → vendor record
Map<Integer, Map<String, Object>> vendingMap = vendingdb.stream()
.filter(m -> m.get("vdid") != null)
.collect(Collectors.toMap(
m -> Integer.parseInt(m.get("vdid").toString()),
m -> m
));
List<Map<String, Object>> finalList = new ArrayList<>();
// Merge logic
for (Map<String, Object> row : streetdb) {
int id = Integer.parseInt(row.get("id").toString());
if (!vendingMap.containsKey(id)) {
continue;
}
// Merge map
Map<String, Object> merged = new HashMap<>(row);
Map<String, Object> vdata = vendingMap.get(id);
merged.put("status", vdata.get("status"));
merged.put("remarks", vdata.get("remarks"));
merged.put("uid_no", vdata.get("uid_no"));
merged.put("event_req_id", vdata.get("event_req_id"));
merged.put("cdate", vdata.get("cdate"));
finalList.add(merged);
}
return finalList;
}
@GetMapping("/finalvendorDetailsById")
public List<Map<String, Object>> finalvendorDetailsById(String requestId){
return createventservices.finalvendorDetailsById(requestId);
}
@Autowired
private createventService createventservices;
@Autowired
private StreetVendorService StreetVendorService;
// @Autowired
// private Environment environment;
@PostMapping("/save")
public ResponseEntity<Map<String, Object>> saveEventWithFile(
@RequestParam("eventName") String eventName,
@RequestParam("eventDate") String eventDateStr,
@RequestParam("file") MultipartFile file,
@RequestParam("cby") String cby) {
Map<String, Object> response = new HashMap<>();
try {
if (file == null || file.isEmpty()) {
response.put("status", false);
response.put("message", "failed");
response.put("description", "File is required");
return ResponseEntity.badRequest().body(response);
}
if (eventName == null || eventName.trim().isEmpty()) {
response.put("status", false);
response.put("message", "failed");
response.put("description", "Event name cannot be empty");
return ResponseEntity.badRequest().body(response);
}
LocalDate eventDate;
try {
eventDate = LocalDate.parse(eventDateStr);
} catch (Exception ex) {
response.put("status", false);
response.put("message", "failed");
response.put("description", "Invalid date format (use yyyy-MM-dd)");
return ResponseEntity.badRequest().body(response);
}
String eventFilePath = StreetVendorService.fileUpload(file, "event_file");
if (eventFilePath == null) {
response.put("status", false);
response.put("message", "failed");
response.put("description", "File upload failed");
return ResponseEntity.internalServerError().body(response);
}
String saveStatus = createventservices.insertEvent(eventName, eventDate, eventFilePath, cby);
if (saveStatus == null || saveStatus.equalsIgnoreCase("error")) {
response.put("status", false);
response.put("message", "failed");
response.put("description", "Failed to save event details");
return ResponseEntity.internalServerError().body(response);
}
response.put("status", true);
response.put("message", "success");
response.put("description", "Details saved successfully");
return ResponseEntity.ok(response);
} catch (Exception e) {
e.printStackTrace();
response.put("status", false);
response.put("message", "failed");
response.put("description", "Internal server error: " + e.getMessage());
return ResponseEntity.internalServerError().body(response);
}
}
// save file and get path
// private String saveFile(MultipartFile file) throws IOException {
//
// String uploadDirectory = environment.getProperty("file.upload.directory");
//
// String folderName = environment.getProperty("vending.foldername");
//
// String fileName =
// LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss")) +
// "_" + file.getOriginalFilename();
//
// String folderPath = uploadDirectory + "/" + folderName + "/";
//
//
// Path dirPath = Paths.get(folderPath);
// if (!Files.exists(dirPath)) {
// Files.createDirectories(dirPath);
// }
//
// Path filePath = dirPath.resolve(fileName);
//
// Files.write(filePath, file.getBytes());
//
// return filePath.toAbsolutePath().toString();
// }
@GetMapping("/dropdown-Event")
public ResponseEntity<List<Map<String, Object>>> ViewDropdownEvent(@RequestParam String userId) {
try {
List<Map<String, Object>> result = createventservices.ViewDropdownEvent(userId);
return ResponseEntity.ok(result);
} catch (Exception e) {
Map<String, Object> error = new HashMap<>();
error.put("error", "Unable to fetch event list");
error.put("details", e.getMessage());
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
.body(Collections.singletonList(error));
}
}
@GetMapping("/committedropdown")
public List<Map<String, Object>> ViewCommitteeDropdownEvent(@RequestParam String userId) {
return createventservices.ViewCommitteeDropdownEvent(userId);
}
@GetMapping("/getreports")
public List<Map<String, Object>> getreports(
@RequestParam(required = false) String meeting,
@RequestParam(required = false) String status,
@RequestParam(required = false) String zone,
@RequestParam(required = false) String ward,
@RequestParam String userId) {
List<Map<String, Object>> streetdb = StreetVendorService.getdataforreport(zone, ward); // BASE LIST
List<Map<String, Object>> vendingdb = createventservices.getdataforreport(meeting, status, userId); // FILTERED
// REQUEST
// LIST
// Convert vendingdb to map: vdid → vendor record
Map<Integer, Map<String, Object>> vendingMap = vendingdb.stream()
.filter(m -> m.get("vdid") != null)
.collect(Collectors.toMap(
m -> Integer.parseInt(m.get("vdid").toString()),
m -> m));
List<Map<String, Object>> finalList = new ArrayList<>();
// Merge logic
for (Map<String, Object> row : streetdb) {
int id = Integer.parseInt(row.get("id").toString());
if (!vendingMap.containsKey(id)) {
continue;
}
// Merge map
Map<String, Object> merged = new HashMap<>(row);
Map<String, Object> vdata = vendingMap.get(id);
merged.put("status", vdata.get("status"));
merged.put("remarks", vdata.get("remarks"));
merged.put("uid_no", vdata.get("uid_no"));
merged.put("event_req_id", vdata.get("event_req_id"));
merged.put("cdate", vdata.get("cdate"));
finalList.add(merged);
}
return finalList;
}
@GetMapping("/finalvendorDetailsById")
public List<Map<String, Object>> finalvendorDetailsById(String requestId) {
return createventservices.finalvendorDetailsById(requestId);
}
}

1115
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/vendor/service/createventService.java
File diff suppressed because it is too large
View File

25
gcc_officer_portal/src/main/java/in/gov/chennaicorporation/gccoffice/vtrack/service/VehicleService.java

@ -671,7 +671,7 @@ public class VehicleService {
break;
case "23":
System.out.println("TempID is 22 (1590940 - Green Committee Report - IMAGE - STATIC)");
System.out.println("TempID is 23 (1590940 - Green Committee Report - IMAGE - STATIC)");
urlString = "https://media.smsgupshup.com/GatewayAPI/rest?"
+ "userid=" + username
+ "&password=" + password
@ -693,6 +693,29 @@ public class VehicleService {
break;
case "24":
System.out.println("TempID is 24 (1590940 - Clean and Safe Guidelines - IMAGE - STATIC)");
urlString = "https://media.smsgupshup.com/GatewayAPI/rest?"
+ "userid=" + username
+ "&password=" + password
+ "&send_to=" + sendTo
+ "&v=1.1&format=json"
+ "&msg_type=IMAGE"
+ "&method=SENDMEDIAMESSAGE"
+ "&caption=%2AGCC+Enforcement+Team+Monitoring%2A%0A%0AToday%27s+%28" + msgDate
+ "%29+Zone+wise+Enforcement+Team+activity+details+shared+above+for+your+reference.%0A%0AFor+more+details%2C+please+click+the+link+below."
+ "&media_url=" + fileURL
+ "&isTemplate=true&footer=GCC+-+IT+Cell";
urlString = "https://sendapiv1.pinbot.ai/pinwa/sendMessage?type=template"
+ "&apikey=" + apikey
+ "&from=" + from
+ "&to={{to}}&templateid=2784943"
+ "&url=" + fileURL
+ "&placeholders=Clean%20and%20Safe%20Construction%20-%20Vehicle%20Violation";
break;
default:
System.out.println("TempID (" + tempid + ") is unknown");
}

506
gcc_officer_portal/src/main/resources/templates/modules/vendors/EventList.html

@ -1,39 +1,42 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="~{fragments/modules/base/head :: head}"></head>
<style>
.required{
color: red;
}
/* Mobile screens - targeting devices with a max width of 767px */
@media (max-width: 767px)
{
#requestlistform label{
margin-top: 10px;
}
}
.required {
color: red;
}
/* Mobile screens - targeting devices with a max width of 767px */
@media (max-width: 767px) {
#requestlistform label {
margin-top: 10px;
}
}
#viewModal .modal-body {
max-height: 70vh; /* Limit the height to 70% of the viewport */
overflow-y: auto; /* Enable vertical scrolling */
max-height: 70vh;
/* Limit the height to 70% of the viewport */
overflow-y: auto;
/* Enable vertical scrolling */
}
.custom-doc-btn {
height: 20px;
width: 80px;
font-size: 9px;
font-weight:bold;
text-align: center;
padding: 0px;
border:1px solid grey;
}
.col-md-3{
padding-bottom: 10px;
}
.comment {
height: 20px;
width: 80px;
font-size: 9px;
font-weight: bold;
text-align: center;
padding: 0px;
border: 1px solid grey;
}
.col-md-3 {
padding-bottom: 10px;
}
.comment {
margin-bottom: 20px;
}
@ -58,244 +61,251 @@ padding-bottom: 10px;
border-top: 1px solid #ccc;
}
</style>
<body>
<!--[if lt IE 8]>
<body>
<!--[if lt IE 8]>
<p class="browserupgrade">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
<![endif]-->
<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>Meeting List</h5>
<span>Vending Committe</span>
</div>
</div>
</div>
<div class="col-lg-4">
<nav class="breadcrumb-container" aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="/gcc/index"><i
class="ik ik-home"></i></a></li>
<li class="breadcrumb-item" aria-current="page">Vending Committe</li>
<li class="breadcrumb-item active" aria-current="page">Meeting List</li>
</ol>
</nav>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12" >
<div class="card">
<div class="card-header">
<span style="font-size: medium;font-weight: bold;">Reports Filters</span><span th:text="${LoginUserId}" id="userIdSpan" style="display: none;"></span><span th:text="${zone}" id="userzone" style="display: none;"></span>
</div>
<div class="card-body">
<div class="row" >
<div class="col-md-4 mb-1">
<label for="meetingdropdown" style="font-size: medium;">Meeting:</label>
<select id="meetingdropdown" class="form-control">
<option value="">Select an Meeting</option>
</select>
</div>
<div class="col-md-2 mb-1">
<label for="statusdropdown" style="font-size: medium;">Status:</label>
<select id="statusdropdown" class="form-control">
<option value="">Select Status</option>
<option value="Approved">Approved</option>
<option value="Rejected">Rejected</option>
<option value="Postponed">Postponed</option>
</select>
</div>
<div class="col-md-3 mb-1">
<label for="zonedropdown" style="font-size: medium;">Zone:</label>
<select id="zonedropdown" class="form-control">
<option value="">Select an Zone</option>
</select>
</div>
<div class="col-md-3 mb-1">
<label for="warddropdown" style="font-size: medium;">Ward:</label>
<select id="warddropdown" class="form-control">
<option value="">Select an Ward</option>
</select>
</div>
<!-- <div class="col-md-4 mb-1">
<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>Meeting List</h5>
<span>Vending Committe</span>
</div>
</div>
</div>
<div class="col-lg-4">
<nav class="breadcrumb-container" aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="/gcc/index"><i class="ik ik-home"></i></a>
</li>
<li class="breadcrumb-item" aria-current="page">Vending Committe</li>
<li class="breadcrumb-item active" aria-current="page">Meeting List</li>
</ol>
</nav>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-header">
<span style="font-size: medium;font-weight: bold;">Reports Filters</span><span
th:text="${LoginUserId}" id="userIdSpan" style="display: none;"></span><span
th:text="${zone}" id="userzone" style="display: none;"></span>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-4 mb-1">
<label for="meetingdropdown" style="font-size: medium;">Meeting:</label>
<select id="meetingdropdown" class="form-control">
<option value="">Select an Meeting</option>
</select>
</div>
<div class="col-md-2 mb-1">
<label for="statusdropdown" style="font-size: medium;">Status:</label>
<select id="statusdropdown" class="form-control">
<option value="">Select Status</option>
<option value="Approved">Approved</option>
<option value="Rejected">Rejected</option>
<option value="Postponed">Postponed</option>
</select>
</div>
<div class="col-md-3 mb-1">
<label for="zonedropdown" style="font-size: medium;">Zone:</label>
<select id="zonedropdown" class="form-control">
<option value="">Select an Zone</option>
</select>
</div>
<div class="col-md-3 mb-1">
<label for="warddropdown" style="font-size: medium;">Ward:</label>
<select id="warddropdown" class="form-control">
<option value="">Select an Ward</option>
</select>
</div>
<!-- <div class="col-md-4 mb-1">
<button class="btn btn-primary" style="margin-top: 32px;" id="submitBtn">Submit</button>
</div> -->
</div>
</div>
<div class="row mt-4">
<div class="col-12 d-flex justify-content-center">
<button class="btn btn-primary" id="submitBtn">Submit</button>
<div class="row mt-4">
<div class="col-12 d-flex justify-content-center">
<button class="btn btn-primary" id="submitBtn">Submit</button>
<button class="btn btn-danger mx-2" id="resetBtn"
name="reset" type="reset">Reset</button>
</div>
</div>
<button class="btn btn-danger mx-2" id="resetBtn" name="reset"
type="reset">Reset</button>
</div>
</div>
</div>
</div>
<div class="card-block">
<div class="page-header-title" >
<h5 style="margin: 0;font-weight: bold;">Vendors Meeting List</h5><hr>
</div>
<div class="card-block">
<div class="page-header-title">
<h5 style="margin: 0;font-weight: bold;">Vendors Meeting List</h5>
<hr>
</div>
<table id="RequestListDatatable" class="table table-striped table-bordered table-hover dataTable" role="grid">
<thead class="thead-dark">
<tr role="row">
<th class="text-center">S.No</th>
<th class="text-center">Request No</th>
<th class="text-center">Zone</th>
<th class="text-center">Ward</th>
<th class="text-center">Public Name</th>
<th class="text-center">Mobile</th>
<th class="text-center">Status</th>
<th class="text-center no-sort" width="%2">View Details</th>
</tr>
</thead>
<tbody>
<table id="RequestListDatatable"
class="table table-striped table-bordered table-hover dataTable" role="grid">
<thead class="thead-dark">
<tr role="row">
<th class="text-center">S.No</th>
<th class="text-center">Request No</th>
<th class="text-center">Zone</th>
<th class="text-center">Ward</th>
<th class="text-center">Public Name</th>
<th class="text-center">Mobile</th>
<th class="text-center">Status</th>
<th class="text-center no-sort" width="%2">View Details</th>
</tr>
</thead>
<tbody>
</tbody>
<tfoot class="thead-dark">
<tr>
<th class="text-center">S.No</th>
<th class="text-center">Request No</th>
<th class="text-center">Zone</th>
<th class="text-center">Ward</th>
<th class="text-center">Public Name</th>
<th class="text-center">Mobile</th>
<th class="text-center">Status</th>
<th class="text-center no-sort" width="%2">View Details</th>
</tr>
</tfoot>
</table>
</tbody>
<tfoot class="thead-dark">
<tr>
<th class="text-center">S.No</th>
<th class="text-center">Request No</th>
<th class="text-center">Zone</th>
<th class="text-center">Ward</th>
<th class="text-center">Public Name</th>
<th class="text-center">Mobile</th>
<th class="text-center">Status</th>
<th class="text-center no-sort" width="%2">View Details</th>
</tr>
</tfoot>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Modal -->
<div class="modal fade" id="viewModal" tabindex="-1" aria-labelledby="viewModalLabel" aria-hidden="true"
data-bs-backdrop="static" data-bs-keyboard="false">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="viewModalLabel">Request Details</h5>
<button type="button" class="close" data-bs-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body" id="modalBodyContent">
<!-- Dynamic content loads here -->
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Modal -->
<div class="modal fade" id="viewModal" tabindex="-1" aria-labelledby="viewModalLabel" aria-hidden="true" data-bs-backdrop="static" data-bs-keyboard="false">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="viewModalLabel">Request Details</h5>
<button type="button" class="close" data-bs-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body" id="modalBodyContent">
<!-- Dynamic content loads here -->
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
<!-- Image Modal -->
<div class="modal fade" id="docModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-dialog-scrollable modal-lg">
<div class="modal-content border-0">
<div class="modal-body p-0 text-center" style="background-color: #f8f9fa;">
<div id="docContainer" style="max-height: 90vh; overflow: auto;"></div>
</div>
</div>
</div>
</div>
<!-- Image Modal -->
<div class="modal fade" id="docModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-dialog-scrollable modal-lg">
<div class="modal-content border-0">
<div class="modal-body p-0 text-center" style="background-color: #f8f9fa;">
<div id="docContainer" style="max-height: 90vh; overflow: auto;"></div>
</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 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>
<footer th:replace="~{fragments/modules/base/footer :: footer}"></footer>
</div>
<footer th:replace="~{fragments/modules/base/footer :: footer}"></footer>
</div>
</div>
</div>
<div th:replace="~{fragments/modules/base/app_module_menu_box :: div}"></div>
<div th:replace="~{fragments/modules/base/app_module_menu_box :: div}"></div>
<script th:replace="~{fragments/modules/base/script :: script}"></script>
<script src="node_modules/tempusdominus-bootstrap-4/build/js/tempusdominus-bootstrap-4.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script>
<script th:replace="~{fragments/modules/base/script :: script}"></script>
<script src="node_modules/tempusdominus-bootstrap-4/build/js/tempusdominus-bootstrap-4.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>
<script type="text/javascript">
<script type="text/javascript">
let userzone = document.getElementById('userzone').textContent;
let userId = document.getElementById('userIdSpan').textContent;
// GLOBAL scope — must be outside any other function
function openDocModal(fileUrl) {
const container = document.getElementById('docContainer');
const ext = fileUrl.split('.').pop().toLowerCase();
// GLOBAL scope — must be outside any other function
function openDocModal(fileUrl) {
const container = document.getElementById('docContainer');
const ext = fileUrl.split('.').pop().toLowerCase();
if (ext === 'pdf') {
container.innerHTML = `<iframe src="${fileUrl}" style="width:100%; height:90vh;" frameborder="0"></iframe>`;
} else {
container.innerHTML = `<img src="${fileUrl}" class="img-fluid" style="max-height:90vh; max-width:100%;" onerror="this.src='/default.jpg'">`;
}
if (ext === 'pdf') {
container.innerHTML = `<iframe src="${fileUrl}" style="width:100%; height:90vh;" frameborder="0"></iframe>`;
} else {
container.innerHTML = `<img src="${fileUrl}" class="img-fluid" style="max-height:90vh; max-width:100%;" onerror="this.src='/default.jpg'">`;
}
$('#docModal').modal('show');
}
$('#docModal').modal('show');
}
$(document).ready(function() {
$(document).ready(function () {
var table = $('#RequestListDatatable').DataTable({
var table = $('#RequestListDatatable').DataTable({
dom: 'Bftip',
columnDefs: [
{ targets: 'no-sort', orderable: false }
@ -347,7 +357,7 @@ padding-bottom: 10px;
});
fetchEventDropdown();
fetchEventDropdown(userId);
let zoneString = userzone; // e.g. "01,02,03,04,05"
if (zoneString) {
@ -369,7 +379,7 @@ padding-bottom: 10px;
fetchWardDropdown(selectedZone);
}
});
fetchVendingCommitteeList("","","","",userId)
fetchVendingCommitteeList("", "", "", "", userId)
});
@ -405,8 +415,8 @@ padding-bottom: 10px;
}
$('#resetBtn').on('click', function () {
location.reload();
return;
location.reload();
return;
});
$('#submitBtn').on('click', function () {
@ -427,21 +437,21 @@ padding-bottom: 10px;
console.log("Selected ward Value:", ward);
// 👉 Now call your API or next function using these two
fetchVendingCommitteeList (meeting, status , zone , ward,userId);
fetchVendingCommitteeList(meeting, status, zone, ward, userId);
});
function fetchVendingCommitteeList(event_req_id,status,zone,ward) {
$('#pageLoader').show();
function fetchVendingCommitteeList(event_req_id, status, zone, ward) {
$('#pageLoader').show();
$.ajax({
url: '/gcc/api/vending/getreports',
data: { meeting: event_req_id,status:status,zone:zone,ward:ward,userId:userId },
data: { meeting: event_req_id, status: status, zone: zone, ward: ward, userId: userId },
method: 'GET',
contentType: 'application/json',
success: function (data) {
$('#pageLoader').hide();
$('#pageLoader').hide();
let tableContainer = $('#RequestListDatatable');
// Destroy any existing DataTable instance
@ -488,8 +498,8 @@ padding-bottom: 10px;
} else if (cellData === 'Rejected') {
$(td).css('color', 'red').css('font-weight', 'bold');
}
else{
$(td).css('color', 'orange').css('font-weight', 'bold');
else {
$(td).css('color', 'orange').css('font-weight', 'bold');
}
}
},
@ -512,17 +522,17 @@ padding-bottom: 10px;
],
columnDefs: [{ targets: 'no-sort', orderable: false }],
lengthMenu: [
[50, 100, 200, 500, -1],
['50 rows', '100 rows', '200 rows', 'Show all']
],
[50, 100, 200, 500, -1],
['50 rows', '100 rows', '200 rows', 'Show all']
],
scrollY: '80vh',
scrollX: true,
responsive: false
});
// Bind view buttons
tableContainer.off('click', '.btn-view');
// Bind view buttons
tableContainer.off('click', '.btn-view');
tableContainer.on('click', '.btn-view', function () {
let id = $(this).data('id');
$.ajax({
@ -549,10 +559,10 @@ padding-bottom: 10px;
const diffAbledDisplay = details.diff_abled ? (details.diff_abled ? 'Yes' : 'No') : '-';
const pmLoanDisplay = details.pm_svanidhi_loan ? (details.pm_svanidhi_loan ? 'Yes' : 'No') : '-';
const bankAccDisplay = details.bank_acc_status ? (details.bank_acc_status === '1' ? 'Yes' : 'No') : '-';
const idCardDisplay= details.vendor_id_card ? (details.vendor_id_card ==='1' ? 'Yes' : 'No') : '-';
const idCardDisplay = details.vendor_id_card ? (details.vendor_id_card === '1' ? 'Yes' : 'No') : '-';
const bankPassbookDisplay = details.bank_acc_status === '1' && details.bank_passbook
? `<img src="${details.bank_passbook}" alt="Bank Passbook" class="img-fluid" style="max-width: 150px;" onerror="this.src='/default.jpg'">`
: '-';
? `<img src="${details.bank_passbook}" alt="Bank Passbook" class="img-fluid" style="max-width: 150px;" onerror="this.src='/default.jpg'">`
: '-';
const aadharFrontBtn = details.aadhar_front_photo ? `<button class="btn btn-sm btn-light custom-doc-btn" onclick="openDocModal('${details.aadhar_front_photo}')">View</button>` : '-';
const rationCardBtn = details.ration_card_photo ? `<button class="btn btn-sm btn-light custom-doc-btn" onclick="openDocModal('${details.ration_card_photo}')">View</button>` : '-';
@ -561,7 +571,7 @@ padding-bottom: 10px;
? `<button class="btn btn-sm btn-light custom-doc-btn" onclick="openDocModal('${details.bank_passbook}')">View</button>`
: '-';
const spacePhotoBtn= details.vendor_space_photo ? `<button class="btn btn-sm btn-light custom-doc-btn" onclick="openDocModal('${details.vendor_space_photo}')">View</button>` : '-';
const spacePhotoBtn = details.vendor_space_photo ? `<button class="btn btn-sm btn-light custom-doc-btn" onclick="openDocModal('${details.vendor_space_photo}')">View</button>` : '-';
let historyHtml = "";
@ -750,18 +760,19 @@ padding-bottom: 10px;
},
error: function (xhr, status, error) {
$('#pageLoader').hide();
$('#pageLoader').hide();
console.error("Error fetching data:", error);
alert("Failed to load vendor list.");
}
});
}
// Call this function on page load
function fetchEventDropdown() {
// Call this function on page load
function fetchEventDropdown(userId) {
$.ajax({
url: '/gcc/api/vending/committedropdown',
type: 'GET',
data: { userId: userId },
dataType: 'json',
success: function (data) {
let eventDropdown = $('#meetingdropdown');
@ -769,12 +780,12 @@ padding-bottom: 10px;
eventDropdown.append('<option value="">Select an Meeting</option>');
data.forEach(function (event) {
// Optional: filter active & not deleted
eventDropdown.append(
$('<option></option>')
.val(event.req_id)
.text(`${event.event_name} - ${event.formated_date}`)
);
// Optional: filter active & not deleted
eventDropdown.append(
$('<option></option>')
.val(event.req_id)
.text(`${event.event_name} - ${event.formated_date}`)
);
});
},
@ -788,6 +799,7 @@ padding-bottom: 10px;
</script>
</body>
</script>
</body>
</html>

614
gcc_officer_portal/src/main/resources/templates/modules/vendors/RequestList.html

@ -1,39 +1,42 @@
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="~{fragments/modules/base/head :: head}"></head>
<style>
.required{
color: red;
}
/* Mobile screens - targeting devices with a max width of 767px */
@media (max-width: 767px)
{
#requestlistform label{
margin-top: 10px;
}
}
.required {
color: red;
}
/* Mobile screens - targeting devices with a max width of 767px */
@media (max-width: 767px) {
#requestlistform label {
margin-top: 10px;
}
}
#viewModal .modal-body {
max-height: 70vh; /* Limit the height to 70% of the viewport */
overflow-y: auto; /* Enable vertical scrolling */
max-height: 70vh;
/* Limit the height to 70% of the viewport */
overflow-y: auto;
/* Enable vertical scrolling */
}
.custom-doc-btn {
height: 20px;
width: 80px;
font-size: 9px;
font-weight:bold;
text-align: center;
padding: 0px;
border:1px solid grey;
}
.col-md-3{
padding-bottom: 10px;
}
.comment {
height: 20px;
width: 80px;
font-size: 9px;
font-weight: bold;
text-align: center;
padding: 0px;
border: 1px solid grey;
}
.col-md-3 {
padding-bottom: 10px;
}
.comment {
margin-bottom: 20px;
}
@ -58,239 +61,250 @@ padding-bottom: 10px;
border-top: 1px solid #ccc;
}
</style>
<body>
<!--[if lt IE 8]>
<body>
<!--[if lt IE 8]>
<p class="browserupgrade">You are using an <strong>outdated</strong> browser. Please <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.</p>
<![endif]-->
<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>Request List</h5>
<span>Vending Committe</span>
</div>
</div>
</div>
<div class="col-lg-4">
<nav class="breadcrumb-container" aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="/gcc/index"><i
class="ik ik-home"></i></a></li>
<li class="breadcrumb-item" aria-current="page">Vending Committe</li>
<li class="breadcrumb-item active" aria-current="page">Request List</li>
</ol>
</nav>
</div>
</div>
</div>
<!-- <h4 class="h4 text-right text-mute" style="font-size: 12px;">
<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>Request List</h5>
<span>Vending Committe</span>
</div>
</div>
</div>
<div class="col-lg-4">
<nav class="breadcrumb-container" aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="/gcc/index"><i class="ik ik-home"></i></a>
</li>
<li class="breadcrumb-item" aria-current="page">Vending Committe</li>
<li class="breadcrumb-item active" aria-current="page">Request List</li>
</ol>
</nav>
</div>
</div>
</div>
<!-- <h4 class="h4 text-right text-mute" style="font-size: 12px;">
Auto refresh in <font id="refresh-countdown">00</font> seconds
</h4> -->
<div class="row">
<div class="col-md-12" >
<div class="card">
<div class="card-block">
<div class="row">
<div class="form-group col-sm-8">
<label for="dropdownevent">Select Meeting
<span class="text-danger">*</span></label>
<select id="dropdownevent" class="form-control">
</select>
</div>
<div class="form-group col-sm-4">
<label for="zonedropdown">Select Zone
</label>
<select id="zonedropdown" class="form-control">
<option value="">Select Zone </option>
</select>
</div>
</div>
<div class="page-header-title" >
<h5 style="margin: 0;font-weight: bold;"><span th:text="${zone}" id="userzone" style="display: none;"></span>Vendors Request List</h5><span th:text="${LoginUserId}" id="userIdSpan" style="display: none;"></span><hr>
</div>
<div>
<table id="RequestListDatatable" class="table table-striped table-bordered table-hover dataTable" role="grid">
<thead class="thead-dark">
<tr role="row">
<th class="text-center">S.No</th>
<th class="text-center">
<input type="checkbox" id="selectAll">Select first 20
</th>
<th class="text-center">Request No</th>
<th class="text-center">Zone</th>
<th class="text-center">Ward</th>
<th class="text-center">Name</th>
<th class="text-center">Mobile</th>
<th class="text-center">Address</th>
<th class="text-center">View Details</th>
<th class="text-center">Status</th>
<th class="text-center">Remarks</th>
<th class="text-center no-sort" width="%2">Action</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="col-md-12" id="bulksavecontainer" style="display: none;">
<div class="card">
<div class="card-block">
<div class="row">
<div class="col-md-6">
<label for="bulkstatus">Select Status<span class="text-danger">*</span> </label>
<select id="bulkstatus" class="form-control">
<option value="">Select</option>
<option value="Approved">Approved</option>
<option value="Rejected">Rejected</option>
<option value="Postponed">Postponed</option>
</select>
</div>
<div class="col-md-6">
<label for="bulkremarks">Remarks<span class="text-danger">*</span></label><br>
<textarea rows="2" id="bulkremarks" class="form-control"></textarea>
</div>
<div class="col-md-12">
<div class="text-center mt-4">
<button type="button" class="btn btn-primary" id="bulksubmitBtn">Submit</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-block">
<div class="row">
<div class="form-group col-sm-8">
<label for="dropdownevent">Select Meeting
<span class="text-danger">*</span></label>
<select id="dropdownevent" class="form-control">
</select>
</div>
<div class="form-group col-sm-4">
<label for="zonedropdown">Select Zone
</label>
<select id="zonedropdown" class="form-control">
<option value="">Select Zone </option>
</select>
</div>
</div>
<div class="page-header-title">
<h5 style="margin: 0;font-weight: bold;"><span th:text="${zone}" id="userzone"
style="display: none;"></span>Vendors Request List</h5><span
th:text="${LoginUserId}" id="userIdSpan" style="display: none;"></span>
<hr>
</div>
<div>
<table id="RequestListDatatable"
class="table table-striped table-bordered table-hover dataTable"
role="grid">
<thead class="thead-dark">
<tr role="row">
<th class="text-center">S.No</th>
<th class="text-center">
<input type="checkbox" id="selectAll">Select first 20
</th>
<th class="text-center">Request No</th>
<th class="text-center">Zone</th>
<th class="text-center">Ward</th>
<th class="text-center">Name</th>
<th class="text-center">Mobile</th>
<th class="text-center">Address</th>
<th class="text-center">View Details</th>
<th class="text-center">Status</th>
<th class="text-center">Remarks</th>
<th class="text-center no-sort" width="%2">Action</th>
</tr>
</thead>
<tbody>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="col-md-12" id="bulksavecontainer" style="display: none;">
<div class="card">
<div class="card-block">
<div class="row">
<div class="col-md-6">
<label for="bulkstatus">Select Status<span class="text-danger">*</span>
</label>
<select id="bulkstatus" class="form-control">
<option value="">Select</option>
<option value="Approved">Approved</option>
<option value="Rejected">Rejected</option>
<option value="Postponed">Postponed</option>
</select>
</div>
<div class="col-md-6">
<label for="bulkremarks">Remarks<span
class="text-danger">*</span></label><br>
<textarea rows="2" id="bulkremarks" class="form-control"></textarea>
</div>
<div class="col-md-12">
<div class="text-center mt-4">
<button type="button" class="btn btn-primary"
id="bulksubmitBtn">Submit</button>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Modal -->
<!-- Modal -->
<div class="modal fade" id="viewModal" tabindex="-1" aria-labelledby="viewModalLabel" aria-hidden="true" data-bs-backdrop="static" data-bs-keyboard="false">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="viewModalLabel">Request Details</h5>
<button type="button" class="close" data-bs-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body" id="modalBodyContent">
<!-- Dynamic content loads here -->
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
</div>
<!-- Image Modal -->
<div class="modal fade" id="docModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-dialog-scrollable modal-lg">
<div class="modal-content border-0">
<div class="modal-body p-0 text-center" style="background-color: #f8f9fa;">
<div id="docContainer" style="max-height: 90vh; overflow: auto;"></div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Modal -->
<!-- Modal -->
<div class="modal fade" id="viewModal" tabindex="-1" aria-labelledby="viewModalLabel" aria-hidden="true"
data-bs-backdrop="static" data-bs-keyboard="false">
<div class="modal-dialog modal-lg">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="viewModalLabel">Request Details</h5>
<button type="button" class="close" data-bs-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body" id="modalBodyContent">
<!-- Dynamic content loads here -->
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
</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>
<!-- Image Modal -->
<div class="modal fade" id="docModal" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-dialog-scrollable modal-lg">
<div class="modal-content border-0">
<div class="modal-body p-0 text-center" style="background-color: #f8f9fa;">
<div id="docContainer" style="max-height: 90vh; overflow: auto;"></div>
</div>
</div>
</div>
</div>
<footer th:replace="~{fragments/modules/base/footer :: footer}"></footer>
</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>
<footer th:replace="~{fragments/modules/base/footer :: footer}"></footer>
</div>
</div>
</div>
<div th:replace="~{fragments/modules/base/app_module_menu_box :: div}"></div>
<script th:replace="~{fragments/modules/base/script :: script}"></script>
<script src="node_modules/tempusdominus-bootstrap-4/build/js/tempusdominus-bootstrap-4.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>
<div th:replace="~{fragments/modules/base/app_module_menu_box :: div}"></div>
<script type="text/javascript">
<script th:replace="~{fragments/modules/base/script :: script}"></script>
<script src="node_modules/tempusdominus-bootstrap-4/build/js/tempusdominus-bootstrap-4.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/xlsx/0.18.5/xlsx.full.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>
<script type="text/javascript">
let userzone = document.getElementById('userzone').textContent;
let userId = document.getElementById('userIdSpan').textContent;
//console.log("userId="+userId);
// GLOBAL scope — must be outside any other function
function openDocModal(fileUrl) {
const container = document.getElementById('docContainer');
const ext = fileUrl.split('.').pop().toLowerCase();
if (ext === 'pdf') {
container.innerHTML = `<iframe src="${fileUrl}" style="width:100%; height:90vh;" frameborder="0"></iframe>`;
} else {
container.innerHTML = `<img src="${fileUrl}" class="img-fluid" style="max-height:90vh; max-width:100%;" onerror="this.src='/default.jpg'">`;
}
//console.log("userId="+userId);
// GLOBAL scope — must be outside any other function
function openDocModal(fileUrl) {
const container = document.getElementById('docContainer');
const ext = fileUrl.split('.').pop().toLowerCase();
if (ext === 'pdf') {
container.innerHTML = `<iframe src="${fileUrl}" style="width:100%; height:90vh;" frameborder="0"></iframe>`;
} else {
container.innerHTML = `<img src="${fileUrl}" class="img-fluid" style="max-height:90vh; max-width:100%;" onerror="this.src='/default.jpg'">`;
}
$('#docModal').modal('show');
}
$('#docModal').modal('show');
}
$(document).ready(function() {
$(document).ready(function () {
var table = $('#RequestListDatatable').DataTable({
var table = $('#RequestListDatatable').DataTable({
dom: 'Bftip',
columnDefs: [
{ width: "150px", targets: 7 },
{width: "150px", targets: 10}
],
{ width: "150px", targets: 7 },
{ width: "150px", targets: 10 }
],
lengthMenu: [
[200, 400, -1],
[200, 400, -1],
['200 rows', '400 rows', 'Show all']
],
scrollY: '50vh',
@ -337,7 +351,7 @@ padding-bottom: 10px;
// Trigger on page load
fetchEventDropdown();
fetchEventDropdown(userId);
let zoneString = userzone; // e.g. "01,02,03,04,05"
@ -354,20 +368,20 @@ padding-bottom: 10px;
$('#dropdownevent').on('change', function () {
$('#zonedropdown').val("");
$('#zonedropdown').val("");
fetchVendingCommitteeList();
});
$('#zonedropdown').on('change', function () {
let miss_meet=$('#dropdownevent').val();
$('#zonedropdown').on('change', function () {
let miss_meet = $('#dropdownevent').val();
if(!miss_meet){
Swal.fire("Warning", "Please select an meeting!", "warning");
return;
}
if (!miss_meet) {
Swal.fire("Warning", "Please select an meeting!", "warning");
return;
}
fetchVendingCommitteeList();
});
@ -477,7 +491,7 @@ padding-bottom: 10px;
const MAX_SELECTION = 20;
function fetchVendingCommitteeList() {
const selectedOption = $('#dropdownevent option:selected').text();
const selectedOption = $('#dropdownevent option:selected').text();
// Assuming the format is: "Event Name - yyyy-mm-dd"
const eventDateRaw = selectedOption.split(' - ')[1];
@ -497,7 +511,7 @@ padding-bottom: 10px;
const formattedDate = `${dateParts[2]}-${dateParts[1]}-${dateParts[0]}`;
// Read zone dropdown value
// Read zone dropdown value
let selectedZone = $('#zonedropdown').val();
// If selected zone is empty → use userzone
@ -510,14 +524,14 @@ padding-bottom: 10px;
$.ajax({
url: '/gcc/api/streetvendor/getvedingcommitteelist',
data: { date: formattedDate,zones:finalZone },
data: { date: formattedDate, zones: finalZone },
method: 'GET',
contentType: 'application/json',
success: function (data) {
//console.log("data="+data);
//console.log("data="+data);
$('#pageLoader').hide();
$('#pageLoader').hide();
let tableContainer = $('#RequestListDatatable');
// Destroy any existing DataTable instance
@ -610,14 +624,14 @@ padding-bottom: 10px;
{ extend: 'pdfHtml5', text: 'PDF', className: 'btn btn-secondary' }
],
columnDefs: [
{ width: "150px", targets: 7 },
{width: "150px", targets: 10}
],
{ width: "150px", targets: 7 },
{ width: "150px", targets: 10 }
],
lengthMenu: [
[200, 400, -1],
['200 rows', '400 rows', 'Show all']
],
lengthMenu: [
[200, 400, -1],
['200 rows', '400 rows', 'Show all']
],
scrollY: '80vh',
scrollX: true,
@ -639,7 +653,7 @@ padding-bottom: 10px;
// FIXED: Only check visible rows on the current page
let allVisible = $(pageRows).find('.row-check').length ===
$(pageRows).find('.row-check:checked').length;
$(pageRows).find('.row-check:checked').length;
$('#selectAll').prop('checked', allVisible);
@ -650,7 +664,7 @@ padding-bottom: 10px;
$('#selectAll').off('change');
$('#selectAll').on('change', function () {
console.log("Select All clicked");
console.log("Select All clicked");
let checked = $(this).is(':checked');
let table = $('#RequestListDatatable').DataTable();
@ -713,7 +727,7 @@ padding-bottom: 10px;
});
tableContainer.on('draw.dt', function () {
enforceMaxLimit();
enforceMaxLimit();
toggleBulkSaveContainer();
});
@ -734,10 +748,10 @@ padding-bottom: 10px;
const diffAbledDisplay = details.diff_abled ? (details.diff_abled ? 'Yes' : 'No') : '-';
const pmLoanDisplay = details.pm_svanidhi_loan ? (details.pm_svanidhi_loan ? 'Yes' : 'No') : '-';
const bankAccDisplay = details.bank_acc_status ? (details.bank_acc_status === '1' ? 'Yes' : 'No') : '-';
const idCardDisplay= details.vendor_id_card ? (details.vendor_id_card ==='1' ? 'Yes' : 'No') : '-';
const idCardDisplay = details.vendor_id_card ? (details.vendor_id_card === '1' ? 'Yes' : 'No') : '-';
const bankPassbookDisplay = details.bank_acc_status === '1' && details.bank_passbook
? `<img src="${details.bank_passbook}" alt="Bank Passbook" class="img-fluid" style="max-width: 150px;" onerror="this.src='/default.jpg'">`
: '-';
? `<img src="${details.bank_passbook}" alt="Bank Passbook" class="img-fluid" style="max-width: 150px;" onerror="this.src='/default.jpg'">`
: '-';
const aadharFrontBtn = details.aadhar_front_photo ? `<button class="btn btn-sm btn-light custom-doc-btn" onclick="openDocModal('${details.aadhar_front_photo}')">View</button>` : '-';
const rationCardBtn = details.ration_card_photo ? `<button class="btn btn-sm btn-light custom-doc-btn" onclick="openDocModal('${details.ration_card_photo}')">View</button>` : '-';
@ -746,7 +760,7 @@ padding-bottom: 10px;
? `<button class="btn btn-sm btn-light custom-doc-btn" onclick="openDocModal('${details.bank_passbook}')">View</button>`
: '-';
const spacePhotoBtn= details.vendor_space_photo ? `<button class="btn btn-sm btn-light custom-doc-btn" onclick="openDocModal('${details.vendor_space_photo}')">View</button>` : '-';
const spacePhotoBtn = details.vendor_space_photo ? `<button class="btn btn-sm btn-light custom-doc-btn" onclick="openDocModal('${details.vendor_space_photo}')">View</button>` : '-';
let postponedHTML = "";
@ -771,7 +785,7 @@ padding-bottom: 10px;
});
}
// Latest postponed entry
// Latest postponed entry
if (details.latestPostponed) {
postponedHTML += `
<div class="comment mb-4">
@ -972,7 +986,7 @@ padding-bottom: 10px;
const $submitBtn = $(this); // ONLY this button
const $submitBtn = $(this); // ONLY this button
$submitBtn.prop('disabled', true).text('Submitting...');
const $row = $(this).closest('tr'); // get the clicked row
@ -985,7 +999,7 @@ padding-bottom: 10px;
const remarks = $row.find('textarea').val();
const eventReqId = $('#dropdownevent').val();
// Event dropdown check
// Event dropdown check
if (!eventReqId) {
Swal.fire({
icon: 'warning',
@ -997,7 +1011,7 @@ padding-bottom: 10px;
}
// Status must be selected
// Status must be selected
if (!status) {
Swal.fire({
icon: 'warning',
@ -1029,57 +1043,57 @@ padding-bottom: 10px;
event_req_id: eventReqId,
zone: rowData.zone,
ward: rowData.ward,
cby:userId,
mob_no:rowData.mob_no
cby: userId,
mob_no: rowData.mob_no
};
console.log("payload = " + JSON.stringify(payload, null, 2));
$('#pageLoader').show();
// 📨 AJAX call
$.ajax({
$.ajax({
url: '/gcc/api/streetvendor/savedetailsforvendor',
method: 'POST',
contentType: 'application/json',
data: JSON.stringify(payload),
success: function (response) {
$('#pageLoader').hide();
$submitBtn.prop('disabled', false).text('Submit');
if (response.status === "success") {
Swal.fire({
icon: 'success',
title: 'Success',
text: response.message,
allowOutsideClick: false,
allowEscapeKey: false,
allowEnterKey: false,
showConfirmButton: true,
}).then((result) => {
if (result.isConfirmed) {
console.log("ok button");
fetchVendingCommitteeList();
}
});
}
else if(response.status === "Error"){
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message,
});
}
else {
Swal.fire('Error', 'Failed to submit data.', 'error');
}
$('#pageLoader').hide();
$submitBtn.prop('disabled', false).text('Submit');
if (response.status === "success") {
Swal.fire({
icon: 'success',
title: 'Success',
text: response.message,
allowOutsideClick: false,
allowEscapeKey: false,
allowEnterKey: false,
showConfirmButton: true,
}).then((result) => {
if (result.isConfirmed) {
console.log("ok button");
fetchVendingCommitteeList();
}
});
}
else if (response.status === "Error") {
Swal.fire({
icon: 'error',
title: 'Error',
text: response.message,
});
}
else {
Swal.fire('Error', 'Failed to submit data.', 'error');
}
},
error: function () {
$('#pageLoader').hide();
$submitBtn.prop('disabled', false).text('Submit');
$('#pageLoader').hide();
$submitBtn.prop('disabled', false).text('Submit');
Swal.fire('Error', 'Something went wrong while submitting.', 'error');
}
});
@ -1088,18 +1102,19 @@ padding-bottom: 10px;
},
error: function (xhr, status, error) {
$('#pageLoader').hide();
$('#pageLoader').hide();
console.error("Error fetching data:", error);
alert("Failed to load vendor list.");
}
});
}
// Call this function on page load
function fetchEventDropdown() {
// Call this function on page load
function fetchEventDropdown(userId) {
$.ajax({
url: '/gcc/api/vending/dropdown-Event',
type: 'GET',
data: { userId: userId },
dataType: 'json',
success: function (data) {
let eventDropdown = $('#dropdownevent');
@ -1123,6 +1138,7 @@ padding-bottom: 10px;
});
}
</script>
</body>
</script>
</body>
</html>

2459
gcc_officer_portal/src/main/resources/templates/modules/vendors/streetVendorRequestForm.html
File diff suppressed because it is too large
View File

Loading…
Cancel
Save