From 549411efa00384b4119ffb3663b8dc77c84cf018 Mon Sep 17 00:00:00 2001 From: yoganandhank Date: Thu, 30 Jul 2026 18:09:08 +0530 Subject: [PATCH] new UI and query changes in gccadjustment management project and payment tracker , gcc manpower --- .../com/gcc_manpower/config/WebConfig.java | 5 + .../controller/AdjustmentController.java | 132 +- .../service/AdjustmentService.java | 48 +- .../gcc_manpower/service/AppUserService.java | 15 + .../resources/application-local.properties | 14 +- .../resources/application-prod.properties | 14 +- .../gccadjustmentmanagement/dashboard.html | 2131 +++++++++++++++-- .../gccservicepaymenttracker/dashboard.html | 4 +- 8 files changed, 2097 insertions(+), 266 deletions(-) diff --git a/src/main/java/com/gcc_manpower/config/WebConfig.java b/src/main/java/com/gcc_manpower/config/WebConfig.java index efab472..aec6f42 100644 --- a/src/main/java/com/gcc_manpower/config/WebConfig.java +++ b/src/main/java/com/gcc_manpower/config/WebConfig.java @@ -57,5 +57,10 @@ public class WebConfig implements WebMvcConfigurer { .toString(); registry.addResourceHandler("/gccadjustmentmanagementfiles/**") .addResourceLocations(adjustmentUploadPath); + + // Map URL path /uploads/** to the physical uploads folder in the project root + String rootUploadPath = Paths.get("uploads").toAbsolutePath().toUri().toString(); + registry.addResourceHandler("/uploads/**") + .addResourceLocations(rootUploadPath); } } diff --git a/src/main/java/com/gcc_manpower/gccadjustmentmanagement/controller/AdjustmentController.java b/src/main/java/com/gcc_manpower/gccadjustmentmanagement/controller/AdjustmentController.java index 93141c7..756c22c 100644 --- a/src/main/java/com/gcc_manpower/gccadjustmentmanagement/controller/AdjustmentController.java +++ b/src/main/java/com/gcc_manpower/gccadjustmentmanagement/controller/AdjustmentController.java @@ -149,6 +149,7 @@ public class AdjustmentController { @RequestParam(value = "id", required = false) Integer id, @RequestParam(value = "vend_name", required = false) String vendName, @RequestParam(value = "fin_year", required = false) String finYear, + @RequestParam(value = "subject", required = false) String subject, @RequestParam(value = "adv_type_id", required = false) String advTypeId, @RequestParam(value = "fund_type_id", required = false) String fundTypeId, @RequestParam(value = "bal_amt", required = false) Double balAmt, @@ -163,6 +164,10 @@ public class AdjustmentController { @RequestParam(value = "ejv_num_file_gen_date", required = false) String ejvNumFileGenDate, @RequestParam(value = "as_file_gen_date", required = false) String asFileGenDate, @RequestParam(value = "as_final_file_gen_date", required = false) String asFinalFileGenDate, + @RequestParam(value = "ac_code", required = false) String acCode, + @RequestParam(value = "file_available_status", required = false) String fileAvailableStatus, + @RequestParam(value = "rtgs_date", required = false) String rtgsDate, + @RequestParam(value = "dc_completed_date", required = false) String dcCompletedDate, @RequestParam(value = "file", required = false) MultipartFile file, @RequestParam(value = "poFile", required = false) MultipartFile poFile, @RequestParam(value = "dcFile", required = false) MultipartFile dcFile, @@ -202,24 +207,38 @@ public class AdjustmentController { } // Save files or keep existing - String filePath = saveFile(file, "file", uploadDir, existing != null ? (String) existing.get("file_path") : null); - String poPath = saveFile(poFile, "po", uploadDir, existing != null ? (String) existing.get("po_file_path") : null); - String dcPath = saveFile(dcFile, "dc", uploadDir, existing != null ? (String) existing.get("dc_file_path") : null); - String irPath = saveFile(irFile, "ir", uploadDir, existing != null ? (String) existing.get("ir_file_path") : null); - String srPath = saveFile(srFile, "sr", uploadDir, existing != null ? (String) existing.get("sr_filepath") : null); - String piPath = saveFile(piFile, "pi", uploadDir, existing != null ? (String) existing.get("pi_file_path") : null); - String fiPath = saveFile(fiFile, "fi", uploadDir, existing != null ? (String) existing.get("fi_file_path") : null); - String tcPath = saveFile(tcFile, "tc", uploadDir, existing != null ? (String) existing.get("tc_file_path") : null); - String rtgsPath = saveFile(rtgsFile, "rtgs", uploadDir, existing != null ? (String) existing.get("rtgs_file_path") : null); - String ejvPath = saveFile(ejvFile, "ejv", uploadDir, existing != null ? (String) existing.get("ejv_num_file_path") : null); - String asPath = saveFile(asFile, "as", uploadDir, existing != null ? (String) existing.get("as_file_path") : null); - String asFinalPath = saveFile(asFinalFile, "as_final", uploadDir, existing != null ? (String) existing.get("as_final_file_path") : null); + String filePath = saveFile(file, "file", fileDataNum, uploadDir, + existing != null ? (String) existing.get("file_path") : null); + String poPath = saveFile(poFile, "po", fileDataNum, uploadDir, + existing != null ? (String) existing.get("po_file_path") : null); + String dcPath = saveFile(dcFile, "dc", fileDataNum, uploadDir, + existing != null ? (String) existing.get("dc_file_path") : null); + String irPath = saveFile(irFile, "ir", fileDataNum, uploadDir, + existing != null ? (String) existing.get("ir_file_path") : null); + String srPath = saveFile(srFile, "sr", fileDataNum, uploadDir, + existing != null ? (String) existing.get("sr_filepath") : null); + String piPath = saveFile(piFile, "pi", fileDataNum, uploadDir, + existing != null ? (String) existing.get("pi_file_path") : null); + String fiPath = saveFile(fiFile, "fi", fileDataNum, uploadDir, + existing != null ? (String) existing.get("fi_file_path") : null); + String tcPath = saveFile(tcFile, "tc", fileDataNum, uploadDir, + existing != null ? (String) existing.get("tc_file_path") : null); + String rtgsPath = saveFile(rtgsFile, "rtgs", fileDataNum, uploadDir, + existing != null ? (String) existing.get("rtgs_file_path") : null); + String ejvPath = saveFile(ejvFile, "ejv", fileDataNum, uploadDir, + existing != null ? (String) existing.get("ejv_num_file_path") : null); + String asPath = saveFile(asFile, "as", fileDataNum, uploadDir, + existing != null ? (String) existing.get("as_file_path") : null); + String asFinalPath = saveFile(asFinalFile, "as_final", fileDataNum, uploadDir, + existing != null ? (String) existing.get("as_final_file_path") : null); // Build data map Map data = new HashMap<>(); - if (id != null) data.put("id", id); + if (id != null) + data.put("id", id); data.put("vend_name", vendName); data.put("fin_year", finYear); + data.put("subject", subject); data.put("adv_type_id", advTypeId); data.put("fund_type_id", fundTypeId); data.put("bal_amt", balAmt); @@ -234,6 +253,10 @@ public class AdjustmentController { data.put("ejv_num_file_gen_date", ejvNumFileGenDate); data.put("as_file_gen_date", asFileGenDate); data.put("as_final_file_gen_date", asFinalFileGenDate); + data.put("ac_code", acCode); + data.put("file_available_status", fileAvailableStatus); + data.put("rtgs_date", rtgsDate); + data.put("dc_completed_date", dcCompletedDate); // Paths data.put("file_path", filePath); @@ -281,7 +304,8 @@ public class AdjustmentController { return response; } - boolean deleted = adjustmentService.deleteAdjustmentFile(id, remarks != null ? remarks : "Deleted by user", username); + boolean deleted = adjustmentService.deleteAdjustmentFile(id, remarks != null ? remarks : "Deleted by user", + username); if (deleted) { response.put("success", true); response.put("message", "Record deleted successfully."); @@ -293,15 +317,87 @@ public class AdjustmentController { return response; } - private String saveFile(MultipartFile f, String prefix, File dir, String currentPath) throws Exception { + @PostMapping("/api/update-ejv") + @ResponseBody + public Map updateEJV( + @RequestParam("id") Integer id, + @RequestParam("ejv_num") String ejvNum, + @RequestParam(value = "ejvFile", required = false) MultipartFile ejvFile, + HttpSession session) { + + Map response = new HashMap<>(); + String username = (String) session.getAttribute("adj_usrName"); + if (username == null) { + response.put("success", false); + response.put("error", "Unauthorized access. Please log in."); + return response; + } + + try { + Map existing = adjustmentService.getAdjustmentFileById(id); + if (existing == null) { + response.put("success", false); + response.put("error", "Record not found."); + return response; + } + + File uploadDir = new File(adjustmentUploadPathConfig).getAbsoluteFile(); + if (!uploadDir.exists()) { + uploadDir.mkdirs(); + } + + String fileDataNum = (String) existing.get("file_data_num"); + String ejvPath = saveFile(ejvFile, "ejv", fileDataNum, uploadDir, + existing != null ? (String) existing.get("ejv_num_file_path") : null); + + boolean updated = adjustmentService.updateEJV(id, ejvNum, ejvPath, username); + if (updated) { + response.put("success", true); + response.put("message", "EJV details updated successfully."); + } else { + response.put("success", false); + response.put("error", "Failed to update EJV details in database."); + } + } catch (Exception e) { + response.put("success", false); + response.put("error", "Error occurred: " + e.getMessage()); + e.printStackTrace(); + } + + return response; + } + + private String saveFile(MultipartFile f, String category, String fileNum, File dir, String currentPath) + throws Exception { if (f == null || f.isEmpty()) { return currentPath; } + + // Clean fileNum + String cleanFileNum = "unknown"; + if (fileNum != null && !fileNum.trim().isEmpty()) { + // Remove illegal characters, but allow slashes / and \ for hierarchy + cleanFileNum = fileNum.trim().replaceAll("[^a-zA-Z0-9.\\/\\\\_-]", "_"); + // Normalize path separators to forward slash / + cleanFileNum = cleanFileNum.replace('\\', '/'); + } + + // Save files inside the physical "uploads" directory in the project root + File projectRoot = new File(".").getAbsoluteFile(); + String subPath = "uploads/file-data/" + cleanFileNum + "/" + category.toUpperCase(); + File folder = new File(projectRoot, subPath).getAbsoluteFile(); + if (!folder.exists()) { + folder.mkdirs(); + } + String orig = f.getOriginalFilename(); String ext = orig != null && orig.lastIndexOf('.') > 0 ? orig.substring(orig.lastIndexOf('.')) : ".pdf"; - String filename = prefix + "_" + System.currentTimeMillis() + ext; - File dest = new File(dir, filename).getAbsoluteFile(); + String cleanName = orig != null + ? orig.substring(0, orig.lastIndexOf('.')).replaceAll("[^a-zA-Z0-9.-]", "_") + ext + : (category + "_" + System.currentTimeMillis() + ext); + File dest = new File(folder, cleanName).getAbsoluteFile(); f.transferTo(dest); - return "gccadjustmentmanagementfiles/" + filename; + + return "uploads/file-data/" + cleanFileNum + "/" + category.toUpperCase() + "/" + cleanName; } } diff --git a/src/main/java/com/gcc_manpower/gccadjustmentmanagement/service/AdjustmentService.java b/src/main/java/com/gcc_manpower/gccadjustmentmanagement/service/AdjustmentService.java index ebaac20..4b337a4 100644 --- a/src/main/java/com/gcc_manpower/gccadjustmentmanagement/service/AdjustmentService.java +++ b/src/main/java/com/gcc_manpower/gccadjustmentmanagement/service/AdjustmentService.java @@ -45,10 +45,12 @@ public class AdjustmentService { public List> getAllFiles() { String sql = "SELECT a.*, " + "adv.adv_type AS resolved_adv_type, " + - "f.fund_type AS resolved_fund_type " + + "f.fund_type AS resolved_fund_type, " + + "u.usr_name AS updated_by_name " + "FROM adjustment_file_details a " + "LEFT JOIN advance_type_list adv ON TRIM(a.adv_type_id) REGEXP '^[0-9]+$' AND adv.id = CAST(TRIM(a.adv_type_id) AS UNSIGNED) " + "LEFT JOIN fund_type_list f ON TRIM(a.fund_type_id) REGEXP '^[0-9]+$' AND f.id = CAST(TRIM(a.fund_type_id) AS UNSIGNED) " + + "LEFT JOIN gcc_manpower.app_user u ON (a.updated_by = CAST(u.usr_id AS CHAR) OR a.updated_by = u.usr_name) " + "WHERE a.is_active = 1 AND a.is_delete = 0 " + "ORDER BY a.updated_date DESC, a.id DESC"; try { @@ -79,10 +81,10 @@ public class AdjustmentService { "as_file_gen_date = ?, as_file_path = ?, as_final_file_gen_date = ?, as_final_file_path = ?, " + "bal_amt = ?, dc_file_path = ?, ejv_num = ?, ejv_num_file_gen_date = ?, ejv_num_file_path = ?, " + "fi_amt = ?, fi_file_gen_date = ?, fi_file_path = ?, file_data_num = ?, file_path = ?, " + - "file_remark = ?, fin_year = ?, ir_file_path = ?, pi_amt = ?, pi_file_gen_date = ?, " + + "file_remark = ?, fin_year = ?, subject = ?, ir_file_path = ?, pi_amt = ?, pi_file_gen_date = ?, " + "pi_file_path = ?, po_file_path = ?, rtgs_file_path = ?, sr_filepath = ?, tc_file_gen_date = ?, " + - "tc_file_path = ?, vend_name = ?, adv_type_id = ?, fund_type_id = ?, updated_date = ?, " + - "updated_by = ? WHERE id = ?"; + "tc_file_path = ?, vend_name = ?, adv_type_id = ?, fund_type_id = ?, ac_code = ?, " + + "file_available_status = ?, dc_completed_date = ?, rtgs_date = ?, updated_date = ?, updated_by = ? WHERE id = ?"; try { int rows = jdbcTemplate.update(sql, parseDate(data.get("as_file_gen_date")), @@ -101,6 +103,7 @@ public class AdjustmentService { data.get("file_path"), data.get("file_remark"), data.get("fin_year"), + data.get("subject"), data.get("ir_file_path"), parseDouble(data.get("pi_amt")), parseDate(data.get("pi_file_gen_date")), @@ -113,10 +116,13 @@ public class AdjustmentService { data.get("vend_name"), data.get("adv_type_id"), data.get("fund_type_id"), + data.get("ac_code"), + data.get("file_available_status"), + parseDate(data.get("dc_completed_date")), + parseDate(data.get("rtgs_date")), now, username, - id - ); + id); return rows > 0; } catch (Exception e) { System.err.println("Error updating adjustment file: " + e.getMessage()); @@ -129,11 +135,11 @@ public class AdjustmentService { "as_file_gen_date, as_file_path, as_final_file_gen_date, as_final_file_path, " + "bal_amt, dc_file_path, ejv_num, ejv_num_file_gen_date, ejv_num_file_path, " + "fi_amt, fi_file_gen_date, fi_file_path, file_data_num, file_path, " + - "file_remark, fin_year, ir_file_path, pi_amt, pi_file_gen_date, " + + "file_remark, fin_year, subject, ir_file_path, pi_amt, pi_file_gen_date, " + "pi_file_path, po_file_path, rtgs_file_path, sr_filepath, tc_file_gen_date, " + - "tc_file_path, vend_name, adv_type_id, fund_type_id, cdate, updated_date, " + - "updated_by, is_active, is_delete) VALUES " + - "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1, 0)"; + "tc_file_path, vend_name, adv_type_id, fund_type_id, ac_code, file_available_status, " + + "dc_completed_date, rtgs_date, cdate, updated_date, updated_by, is_active, is_delete) VALUES " + + "(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 1, 0)"; try { int rows = jdbcTemplate.update(sql, parseDate(data.get("as_file_gen_date")), @@ -152,6 +158,7 @@ public class AdjustmentService { data.get("file_path"), data.get("file_remark"), data.get("fin_year"), + data.get("subject"), data.get("ir_file_path"), parseDouble(data.get("pi_amt")), parseDate(data.get("pi_file_gen_date")), @@ -164,10 +171,13 @@ public class AdjustmentService { data.get("vend_name"), data.get("adv_type_id"), data.get("fund_type_id"), + data.get("ac_code"), + data.get("file_available_status"), + parseDate(data.get("dc_completed_date")), + parseDate(data.get("rtgs_date")), now, now, - username - ); + username); return rows > 0; } catch (Exception e) { System.err.println("Error saving adjustment file: " + e.getMessage()); @@ -190,6 +200,20 @@ public class AdjustmentService { } } + public boolean updateEJV(int id, String ejvNum, String ejvFilePath, String username) { + java.sql.Timestamp now = new java.sql.Timestamp(System.currentTimeMillis()); + java.sql.Date today = new java.sql.Date(System.currentTimeMillis()); + String sql = "UPDATE adjustment_file_details SET ejv_num = ?, ejv_num_file_path = ?, ejv_num_file_gen_date = ?, updated_date = ?, updated_by = ? WHERE id = ?"; + try { + int rows = jdbcTemplate.update(sql, ejvNum, ejvFilePath, today, now, username, id); + return rows > 0; + } catch (Exception e) { + System.err.println("Error updating EJV: " + e.getMessage()); + e.printStackTrace(); + return false; + } + } + private java.sql.Date parseDate(Object val) { if (val == null || String.valueOf(val).trim().isEmpty()) { return null; diff --git a/src/main/java/com/gcc_manpower/service/AppUserService.java b/src/main/java/com/gcc_manpower/service/AppUserService.java index 35e2d66..9629b12 100644 --- a/src/main/java/com/gcc_manpower/service/AppUserService.java +++ b/src/main/java/com/gcc_manpower/service/AppUserService.java @@ -311,6 +311,9 @@ public class AppUserService { } public Map getEmployeeByCode(String empCode) { + if (empCode != null) { + empCode = empCode.trim(); + } String sql = "SELECT id, emp_code, name, email, mobile, user_type, designation, location, vendor_id, joined_date, isactive, isdelete " + "FROM employee_details " + @@ -327,6 +330,9 @@ public class AppUserService { } public boolean addEmployee(Map emp, String updatedByUsername) { + if (emp != null && emp.get("emp_code") != null) { + emp.put("emp_code", String.valueOf(emp.get("emp_code")).trim()); + } String checkSql = "SELECT COUNT(*) FROM employee_details WHERE emp_code = ? AND isdelete = 0"; try { Integer count = jdbcManpowerTemplate.queryForObject(checkSql, Integer.class, emp.get("emp_code")); @@ -415,6 +421,9 @@ public class AppUserService { } public boolean updateEmployee(Map emp, String updatedByUsername) { + if (emp != null && emp.get("emp_code") != null) { + emp.put("emp_code", String.valueOf(emp.get("emp_code")).trim()); + } String empCode = (String) emp.get("emp_code"); String selectSql = "SELECT emp_code, name, email, mobile, user_type, designation, location, vendor_id, isactive, isdelete, updated_by, cdate " + @@ -758,6 +767,9 @@ public class AppUserService { } public boolean deleteEmployee(String empCode, String updatedByUsername) { + if (empCode != null) { + empCode = empCode.trim(); + } String selectSql = "SELECT designation, vendor_id FROM employee_details WHERE emp_code = ? AND isdelete = 0"; try { List> list = jdbcManpowerTemplate.queryForList(selectSql, empCode); @@ -860,6 +872,9 @@ public class AppUserService { } public boolean restoreEmployee(String empCode, String updatedByUsername) { + if (empCode != null) { + empCode = empCode.trim(); + } String selectSql = "SELECT designation, vendor_id FROM employee_details WHERE emp_code = ?"; try { List> list = jdbcManpowerTemplate.queryForList(selectSql, empCode); diff --git a/src/main/resources/application-local.properties b/src/main/resources/application-local.properties index 6c15434..5c5cae6 100644 --- a/src/main/resources/application-local.properties +++ b/src/main/resources/application-local.properties @@ -21,11 +21,19 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # =============================== spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true -# spring.jpa.properties.hibernate.format_sql=true +spring.jpa.properties.hibernate.format_sql=true spring.jpa.open-in-view=true logging.level.org.hibernate.SQL=DEBUG -# logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE -logging.level.org.hibernate.type.descriptor.sql=TRACE +# Log bind parameters in Hibernate 6 / Spring Boot 3 +logging.level.org.hibernate.orm.jdbc.bind=TRACE + +# =============================== +# Spring JDBC / JdbcTemplate Logging +# =============================== +# Log queries executed by JdbcTemplate +logging.level.org.springframework.jdbc.core.JdbcTemplate=DEBUG +# Log values bound as placeholders in JdbcTemplate queries +logging.level.org.springframework.jdbc.core.StatementCreatorUtils=TRACE # Production context path server.servlet.context-path=/gcc_manpower diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index d055431..0e8745a 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -31,11 +31,19 @@ spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver # =============================== spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true -# spring.jpa.properties.hibernate.format_sql=true +spring.jpa.properties.hibernate.format_sql=true spring.jpa.open-in-view=true logging.level.org.hibernate.SQL=DEBUG -# logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE -logging.level.org.hibernate.type.descriptor.sql=TRACE +# Log bind parameters in Hibernate 6 / Spring Boot 3 +logging.level.org.hibernate.orm.jdbc.bind=TRACE + +# =============================== +# Spring JDBC / JdbcTemplate Logging +# =============================== +# Log queries executed by JdbcTemplate +logging.level.org.springframework.jdbc.core.JdbcTemplate=DEBUG +# Log values bound as placeholders in JdbcTemplate queries +logging.level.org.springframework.jdbc.core.StatementCreatorUtils=TRACE # Production context path server.servlet.context-path=/gcc_manpower diff --git a/src/main/resources/templates/gccadjustmentmanagement/dashboard.html b/src/main/resources/templates/gccadjustmentmanagement/dashboard.html index 2430001..2db3c1a 100644 --- a/src/main/resources/templates/gccadjustmentmanagement/dashboard.html +++ b/src/main/resources/templates/gccadjustmentmanagement/dashboard.html @@ -51,6 +51,8 @@ --slate-800: #1e293b; --success: #10b981; --success-light: #ecfdf5; + --warning: #f59e0b; + --warning-light: #fffbeb; --danger: #ef4444; --danger-light: #fef2f2; --card-shadow: 0 10px 30px rgba(0, 0, 0, 0.03); @@ -457,10 +459,29 @@ /* Table styles */ .table-responsive-custom { border-radius: 12px; - overflow: hidden; + overflow-x: auto; border: 1px solid var(--slate-200); } + .table-responsive-custom::-webkit-scrollbar { + height: 8px; + } + + .table-responsive-custom::-webkit-scrollbar-track { + background: var(--slate-100); + border-radius: 10px; + } + + .table-responsive-custom::-webkit-scrollbar-thumb { + background: var(--slate-300); + border-radius: 10px; + transition: var(--transition); + } + + .table-responsive-custom::-webkit-scrollbar-thumb:hover { + background: var(--primary); + } + .table-custom { margin-bottom: 0; font-size: 0.88rem; @@ -594,9 +615,9 @@ .count-badge-btn { background-color: #ffffff; border: 1px solid var(--slate-300); - padding: 12px 24px; - border-radius: 16px; - font-size: 1rem; + padding: 8px 16px; + border-radius: 12px; + font-size: 0.9rem; font-weight: 600; color: var(--primary); cursor: pointer; @@ -607,33 +628,38 @@ box-shadow: 0 4px 10px rgba(0, 0, 0, 0.02); text-decoration: none; width: 100%; - max-width: 500px; - margin: 0 auto; } .count-badge-btn:hover { background-color: var(--primary-light); border-color: var(--primary); color: var(--primary); - transform: translateY(-2px); - box-shadow: 0 8px 20px rgba(10, 75, 100, 0.1); + transform: translateY(-1px); + box-shadow: 0 4px 12px rgba(10, 75, 100, 0.08); + } + + .count-badge-btn.active-card { + background-color: var(--primary-light) !important; + border: 2px solid var(--primary) !important; + box-shadow: 0 4px 12px rgba(10, 75, 100, 0.12) !important; + transform: translateY(-1px) scale(1.01); } .count-card-label { font-family: 'Outfit', sans-serif; - font-size: 1.05rem; + font-size: 0.92rem; font-weight: 700; display: flex; align-items: center; - gap: 10px; + gap: 8px; } .count-card-number { background-color: var(--primary-light); color: var(--primary); - padding: 4px 14px; - border-radius: 20px; - font-size: 0.9rem; + padding: 2px 10px; + border-radius: 12px; + font-size: 0.82rem; font-weight: 800; transition: var(--transition); } @@ -642,6 +668,189 @@ background-color: var(--primary); color: #ffffff; } + + /* Pagination custom styles */ + .pagination .page-link { + color: var(--primary); + border-color: var(--slate-200); + background-color: #ffffff; + transition: var(--transition); + } + + .pagination .page-item.active .page-link { + background-color: var(--primary) !important; + border-color: var(--primary) !important; + color: #ffffff !important; + } + + .pagination .page-link:hover { + background-color: var(--primary-light); + color: var(--primary); + border-color: var(--primary); + } + + .pagination .page-item.disabled .page-link { + color: var(--slate-400); + background-color: var(--slate-50); + border-color: var(--slate-200); + } + + /* Split-up compact table cells styling */ + #panel-split-content table th, + #panel-split-content table td { + padding: 5px 8px !important; + font-size: 0.88rem !important; + } + + /* Mobile and Tablet Responsiveness */ + @media (max-width: 991px) { + .header { + flex-direction: column; + gap: 15px; + padding: 15px 20px; + align-items: center; + text-align: center; + } + + .logo-left { + flex-direction: column; + gap: 5px; + text-align: center; + } + + .logo-text h2 { + font-size: 0.95rem; + } + + .header-title { + position: static; + transform: none; + margin: 10px 0; + } + + .header-title h2 { + font-size: 1.15rem; + } + + .user-menu { + flex-direction: row; + justify-content: center; + width: 100%; + gap: 10px; + } + + .user-badge { + padding: 6px 12px; + font-size: 0.8rem; + } + + .btn-logout { + padding: 6px 14px; + font-size: 0.8rem; + } + + .top-navbar { + padding: 10px 15px; + overflow-x: auto; + display: block; + } + + .nav-pills-container { + display: inline-flex; + flex-wrap: nowrap; + padding-bottom: 5px; + width: max-content; + } + + .nav-pill-btn { + padding: 6px 14px; + font-size: 0.8rem; + white-space: nowrap; + } + } + + @media (max-width: 767px) { + .app-content { + padding: 12px; + } + + .card-custom { + padding: 15px; + border-radius: 12px; + margin-bottom: 15px; + } + + .section-header-title { + font-size: 1.2rem; + margin-bottom: 15px; + flex-direction: column; + align-items: flex-start; + gap: 5px; + } + + .count-badge-btn { + padding: 10px 14px; + } + + .count-card-label { + font-size: 0.82rem; + } + + .count-card-number { + padding: 1px 8px; + font-size: 0.78rem; + } + + /* Table filters grid layout */ + .view-panel .card-custom .d-flex.gap-2.align-items-center.flex-wrap { + width: 100%; + display: grid !important; + grid-template-columns: 1fr 1fr; + gap: 8px !important; + } + + .view-panel .card-custom .d-flex.gap-2.align-items-center.flex-wrap select, + .view-panel .card-custom .d-flex.gap-2.align-items-center.flex-wrap input, + .view-panel .card-custom .d-flex.gap-2.align-items-center.flex-wrap button { + width: 100% !important; + height: 38px !important; + font-size: 0.85rem !important; + margin: 0 !important; + } + + .view-panel .card-custom .d-flex.gap-2.align-items-center.flex-wrap input { + grid-column: span 2; + } + + .view-panel .card-custom .d-flex.gap-2.align-items-center.flex-wrap button { + grid-column: span 2; + } + + /* Split up report filters stack */ + .bg-light.p-2.rounded.d-flex { + display: grid !important; + grid-template-columns: 1fr; + gap: 10px !important; + width: 100%; + } + + .bg-light.p-2.rounded.d-flex .d-flex { + width: 100%; + justify-content: space-between; + } + + .bg-light.p-2.rounded.d-flex select { + width: 70% !important; + } + + /* Pagination stacked layout */ + .mt-4.flex-wrap { + flex-direction: column !important; + align-items: center !important; + text-align: center; + gap: 15px !important; + } + } @@ -682,17 +891,21 @@ - - + -
+
@@ -712,151 +925,67 @@
-
-
- Adjustment Summary Counts +
+
+
+
+ Adjustment Summary Counts +
+
-
+
-
- -
-
- -
-
- -

New - File Registration

- -
- - - - -
- - - - -
- - -
- - -
- - -
- - -
- -
-
- Choose File -
- -
- -
-
-
- - -
- - -
- - -
- -
-
- Choose File -
- -
- -
-
-
- - -
- - -
- - -
- - -
- - -
- - -
- - - - -
- - -
- - -
- - -
+ +
+
+ +
- -
- +
+ +
- +
+ +
+ +
@@ -870,6 +999,26 @@ style="width: 180px; height: 40px;" onchange="filterRecordsList()"> + + + + @@ -884,17 +1033,36 @@ - - - + + + - - - - - + + + + + + + - + + @@ -903,6 +1071,30 @@
IDVendor NameFin YearS.No + Fin Year + File NumAdvance TypeFund TypeBal AmountPI AmountFI AmountAdvance TypeFund TypeA/C CodeFile Available + Bal Amount + + PI Amount + + FI Amount + EJV NumberLast Updated + Last Updated + Updated By Actions
+ + +
+
+ Show + + entries +
+
+ Showing 0 to 0 of 0 entries +
+ +
@@ -948,6 +1140,394 @@
+ +
+
+
+ +

Update EJV Number

+
+
+
+
+ +
+ + + + +
+ + +
+ + +
+ + +
+ +
+
+ Choose File +
+ +
+ +
+
+
+ + +
+ + +
+ + +
+ +
+
+
+
+
+ + + +
+
+
+ + + @@ -980,9 +1560,16 @@ diff --git a/src/main/resources/templates/gccservicepaymenttracker/dashboard.html b/src/main/resources/templates/gccservicepaymenttracker/dashboard.html index f172030..a2f360f 100644 --- a/src/main/resources/templates/gccservicepaymenttracker/dashboard.html +++ b/src/main/resources/templates/gccservicepaymenttracker/dashboard.html @@ -1087,7 +1087,7 @@

- Total No of Pedning Bills days wise + Total No of Pending Bills days wise count

@@ -4530,7 +4530,7 @@ const pad = n => String(n).padStart(2, '0'); dateDisplay = `${pad(d.getDate())}/${pad(d.getMonth() + 1)}/${d.getFullYear()}`; } - } catch (e) {} + } catch (e) { } openModalForCount('latest_updates', latestDate, `Latest Updates (${dateDisplay})`); }