19 changed files with 14898 additions and 77 deletions
-
10src/main/java/com/gcc/commissionerreview/configuration/AppConfig.java
-
26src/main/java/com/gcc/commissionerreview/configuration/DataSourceConfig.java
-
360src/main/java/com/gcc/commissionerreview/controller/GccShelterController.java
-
32src/main/java/com/gcc/commissionerreview/controller/MainController.java
-
258src/main/java/com/gcc/commissionerreview/controller/ShelterInspectionController.java
-
1181src/main/java/com/gcc/commissionerreview/service/GccShelterService.java
-
139src/main/java/com/gcc/commissionerreview/service/MasterShelterService.java
-
1419src/main/java/com/gcc/commissionerreview/service/ShelterInspectionService.java
-
2src/main/resources/application-prod.properties
-
1src/main/resources/application.properties
-
72src/main/resources/templates/modules/bulkwaste/bulkwastereport.html
-
1891src/main/resources/templates/modules/shelterinspection/complaintlist.html
-
2809src/main/resources/templates/modules/shelterinspection/dashboard.html
-
1751src/main/resources/templates/modules/shelterinspection/meetinglist.html
-
1848src/main/resources/templates/modules/shelterinspection/resucelist.html
-
634src/main/resources/templates/modules/shelterinspection/shelterlist.html
-
2147src/main/resources/templates/modules/shelterinspection/visitlist.html
-
389src/main/resources/templates/modules/shelterpagereport.html
@ -0,0 +1,360 @@ |
|||
package com.gcc.commissionerreview.controller; |
|||
|
|||
import java.util.HashMap; |
|||
import java.util.List; |
|||
import java.util.Map; |
|||
|
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.http.HttpStatus; |
|||
import org.springframework.http.ResponseEntity; |
|||
import org.springframework.web.bind.annotation.GetMapping; |
|||
import org.springframework.web.bind.annotation.RequestMapping; |
|||
import org.springframework.web.bind.annotation.RequestParam; |
|||
import org.springframework.web.bind.annotation.RestController; |
|||
import org.springframework.web.client.HttpClientErrorException; |
|||
import org.springframework.web.client.HttpServerErrorException; |
|||
import org.springframework.web.client.ResourceAccessException; |
|||
import org.springframework.web.client.RestTemplate; |
|||
|
|||
import com.gcc.commissionerreview.configuration.AppConfig; |
|||
import com.gcc.commissionerreview.service.MasterShelterService; |
|||
import com.gcc.commissionerreview.service.GccShelterService; |
|||
|
|||
|
|||
|
|||
|
|||
@RestController |
|||
@RequestMapping("/commissionerreview/api/shelter") |
|||
public class GccShelterController { |
|||
|
|||
@Autowired |
|||
private GccShelterService shelterApiService; |
|||
|
|||
@Autowired |
|||
private MasterShelterService masterShelterService; |
|||
|
|||
private final RestTemplate restTemplate; |
|||
private final AppConfig appConfig; |
|||
|
|||
@Autowired |
|||
public GccShelterController(RestTemplate restTemplate, AppConfig appConfig) { |
|||
this.restTemplate = restTemplate; |
|||
this.appConfig = appConfig; |
|||
} |
|||
|
|||
@GetMapping("/shelterComplaintList") |
|||
public List<Map<String,Object>> shelterComplaintList( |
|||
@RequestParam(required=false) String fromDate, |
|||
@RequestParam(required=false) String toDate, |
|||
@RequestParam(required = false) String zone, |
|||
@RequestParam(required = false) String category) { |
|||
return shelterApiService.getShelterComplaintList(fromDate, toDate, zone, category); |
|||
} |
|||
|
|||
@GetMapping("/shelterComplaintDetails") |
|||
public List<Map<String, Object>> shelterComplaintDetails( |
|||
@RequestParam String uqid, |
|||
@RequestParam(required = false) String fromDate, |
|||
@RequestParam(required = false) String toDate) { |
|||
return shelterApiService.getShelterComplaintDetails(uqid, fromDate, toDate); |
|||
} |
|||
|
|||
@GetMapping("/shelterComplaintMinDate") |
|||
public String shelterComplaintMinDate() { |
|||
return shelterApiService.getShelterComplaintMinDate(); |
|||
} |
|||
|
|||
@GetMapping("/shelterMeetingList") |
|||
public List<Map<String,Object>> shelterMeetingList( |
|||
@RequestParam(required=false) String fromDate, |
|||
@RequestParam(required=false) String toDate, |
|||
@RequestParam(required = false) String zone, |
|||
@RequestParam(required = false) String category) { |
|||
return shelterApiService.getShelterMeetingList(fromDate, toDate, zone, category); |
|||
} |
|||
|
|||
@GetMapping("/shelterMeetingDetails") |
|||
public List<Map<String, Object>> shelterMeetingDetails( |
|||
@RequestParam String uqid, |
|||
@RequestParam(required = false) String fromDate, |
|||
@RequestParam(required = false) String toDate) { |
|||
return shelterApiService.getShelterMeetingDetails(uqid, fromDate, toDate); |
|||
} |
|||
|
|||
@GetMapping("/shelterMeetingMinDate") |
|||
public String shelterMeetingMinDate() { |
|||
return shelterApiService.getShelterMeetingMinDate(); |
|||
} |
|||
|
|||
@GetMapping("/shelterResuceList") |
|||
public List<Map<String,Object>> shelterResuceList( |
|||
@RequestParam(required=false) String fromDate, |
|||
@RequestParam(required=false) String toDate, |
|||
@RequestParam(required = false) String zone, |
|||
@RequestParam(required = false) String category) { |
|||
return shelterApiService.getShelterRescueList(fromDate, toDate, zone, category); |
|||
} |
|||
|
|||
@GetMapping("/shelterResuceDetails") |
|||
public List<Map<String, Object>> shelterResuceDetails( |
|||
@RequestParam String uqid, |
|||
@RequestParam(required = false) String fromDate, |
|||
@RequestParam(required = false) String toDate) { |
|||
return shelterApiService.getShelterRescueDetails(uqid, fromDate, toDate); |
|||
} |
|||
|
|||
@GetMapping("/shelterRescuedPeopleDetails") |
|||
public List<Map<String, Object>> getShelterRescuedPeopleDetails( |
|||
@RequestParam String surveyId,@RequestParam(required = false) String fromDate, |
|||
@RequestParam(required = false) String toDate) { |
|||
return shelterApiService.getShelterRescuedPeopleDetails(surveyId, fromDate, toDate); |
|||
} |
|||
|
|||
@GetMapping("/shelterResuceMinDate") |
|||
public String shelterResuceMinDate() { |
|||
return shelterApiService.getShelterResuceMinDate(); |
|||
} |
|||
|
|||
|
|||
|
|||
@GetMapping("/complaintquestions") |
|||
public ResponseEntity<?> getcomplaintquestionsDetails( |
|||
@RequestParam("cid") String cid) { |
|||
|
|||
try { |
|||
|
|||
String apiUrl = appConfig.sheltercomplainturl + "/questions?cid=" + cid; |
|||
|
|||
System.out.println("API URL for complaint questions: " + apiUrl); |
|||
|
|||
ResponseEntity<Object> response = restTemplate.getForEntity( apiUrl, Object.class); |
|||
return ResponseEntity.status(response.getStatusCode()).body(response.getBody()); |
|||
|
|||
} |
|||
|
|||
catch (HttpClientErrorException e) { |
|||
System.out.println("COmplaint Question API Client Error: " + e.getStatusCode()); |
|||
return ResponseEntity.status(e.getStatusCode()).body(e.getResponseBodyAsString()); |
|||
} |
|||
|
|||
catch (HttpServerErrorException e) { |
|||
System.out.println("Complaint Question API Server Error: " + e.getStatusCode()); |
|||
return ResponseEntity.status(e.getStatusCode()).body(e.getResponseBodyAsString()); |
|||
} |
|||
|
|||
catch (ResourceAccessException e) { |
|||
System.out.println("Complaint Question API Connection Error: " + e.getMessage()); |
|||
return ResponseEntity.status(HttpStatus.BAD_GATEWAY) |
|||
.body( |
|||
Map.of( |
|||
"status", false, |
|||
"message", |
|||
"Unable to connect to Complaint Question Master API." |
|||
) |
|||
); |
|||
|
|||
} catch (Exception e) { |
|||
|
|||
System.out.println("Complaint Question API Exception"); |
|||
|
|||
e.printStackTrace(); |
|||
|
|||
return ResponseEntity |
|||
.status(HttpStatus.INTERNAL_SERVER_ERROR) |
|||
.body( |
|||
Map.of( |
|||
"status", false, |
|||
"message", |
|||
"Unable to load complaint question details." |
|||
) |
|||
); |
|||
} |
|||
} |
|||
|
|||
@GetMapping("/meetingquestions") |
|||
public ResponseEntity<?> getmeetingquestionsDetails( |
|||
@RequestParam("cid") String cid) { |
|||
|
|||
try { |
|||
|
|||
String apiUrl = |
|||
appConfig.sheltermeetingurl + "/questions?cid=" + cid; |
|||
|
|||
System.out.println( |
|||
"API URL for meeting questions: " + apiUrl |
|||
); |
|||
|
|||
ResponseEntity<Object> response = |
|||
restTemplate.getForEntity( |
|||
apiUrl, |
|||
Object.class |
|||
); |
|||
|
|||
return ResponseEntity |
|||
.status(response.getStatusCode()) |
|||
.body(response.getBody()); |
|||
|
|||
} catch (HttpClientErrorException e) { |
|||
|
|||
System.out.println( |
|||
"Meeting Question API Client Error: " + |
|||
e.getStatusCode() |
|||
); |
|||
|
|||
return ResponseEntity |
|||
.status(e.getStatusCode()) |
|||
.body(e.getResponseBodyAsString()); |
|||
|
|||
} catch (HttpServerErrorException e) { |
|||
|
|||
System.out.println( |
|||
"Meeting Question API Server Error: " + |
|||
e.getStatusCode() |
|||
); |
|||
|
|||
return ResponseEntity |
|||
.status(e.getStatusCode()) |
|||
.body(e.getResponseBodyAsString()); |
|||
|
|||
} catch (ResourceAccessException e) { |
|||
|
|||
System.out.println( |
|||
"Meeting Question API Connection Error: " + |
|||
e.getMessage() |
|||
); |
|||
|
|||
return ResponseEntity |
|||
.status(HttpStatus.BAD_GATEWAY) |
|||
.body( |
|||
Map.of( |
|||
"status", false, |
|||
"message", |
|||
"Unable to connect to Meeting Question Master API." |
|||
) |
|||
); |
|||
|
|||
} catch (Exception e) { |
|||
|
|||
System.out.println( |
|||
"Meeting Question API Exception" |
|||
); |
|||
|
|||
e.printStackTrace(); |
|||
|
|||
return ResponseEntity |
|||
.status(HttpStatus.INTERNAL_SERVER_ERROR) |
|||
.body( |
|||
Map.of( |
|||
"status", false, |
|||
"message", |
|||
"Unable to load meeting question details." |
|||
) |
|||
); |
|||
} |
|||
} |
|||
|
|||
@GetMapping("/resucequestions") |
|||
public ResponseEntity<?> getresucequestionsDetails( |
|||
@RequestParam("cid") String cid) { |
|||
|
|||
try { |
|||
|
|||
String apiUrl = |
|||
appConfig.shelterresuceurl + "/questions?cid=" + cid; |
|||
|
|||
System.out.println( |
|||
"API URL for meeting questions: " + apiUrl |
|||
); |
|||
|
|||
ResponseEntity<Object> response = |
|||
restTemplate.getForEntity( |
|||
apiUrl, |
|||
Object.class |
|||
); |
|||
|
|||
return ResponseEntity |
|||
.status(response.getStatusCode()) |
|||
.body(response.getBody()); |
|||
|
|||
} catch (HttpClientErrorException e) { |
|||
|
|||
System.out.println( |
|||
"Resuce Question API Client Error: " + |
|||
e.getStatusCode() |
|||
); |
|||
|
|||
return ResponseEntity |
|||
.status(e.getStatusCode()) |
|||
.body(e.getResponseBodyAsString()); |
|||
|
|||
} catch (HttpServerErrorException e) { |
|||
|
|||
System.out.println( |
|||
"Resuce Question API Server Error: " + |
|||
e.getStatusCode() |
|||
); |
|||
|
|||
return ResponseEntity |
|||
.status(e.getStatusCode()) |
|||
.body(e.getResponseBodyAsString()); |
|||
|
|||
} catch (ResourceAccessException e) { |
|||
|
|||
System.out.println( |
|||
"Resuce Question API Connection Error: " + |
|||
e.getMessage() |
|||
); |
|||
|
|||
return ResponseEntity |
|||
.status(HttpStatus.BAD_GATEWAY) |
|||
.body( |
|||
Map.of( |
|||
"status", false, |
|||
"message", |
|||
"Unable to connect to Resuce Question Master API." |
|||
) |
|||
); |
|||
|
|||
} catch (Exception e) { |
|||
|
|||
System.out.println( |
|||
"Resuce Question API Exception" |
|||
); |
|||
|
|||
e.printStackTrace(); |
|||
|
|||
return ResponseEntity |
|||
.status(HttpStatus.INTERNAL_SERVER_ERROR) |
|||
.body( |
|||
Map.of( |
|||
"status", false, |
|||
"message", |
|||
"Unable to load Resuce question details." |
|||
) |
|||
); |
|||
} |
|||
} |
|||
|
|||
|
|||
@GetMapping("/categories") |
|||
public List<String> getCategories() { |
|||
return masterShelterService.getCategoryList(); |
|||
} |
|||
|
|||
@GetMapping("/zones") |
|||
public List<String> getZones() { |
|||
return masterShelterService.getZoneList(); |
|||
} |
|||
|
|||
@GetMapping("/cdos") |
|||
public List<Map<String, Object>> getCdos() { |
|||
return masterShelterService.getCdos(); |
|||
} |
|||
|
|||
@GetMapping("/years") |
|||
public List<Integer> getYears() { |
|||
return masterShelterService.getAvailableYears(); |
|||
} |
|||
|
|||
|
|||
} |
|||
@ -0,0 +1,258 @@ |
|||
package com.gcc.commissionerreview.controller; |
|||
|
|||
import java.util.HashMap; |
|||
import java.util.List; |
|||
import java.util.Map; |
|||
|
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.http.HttpStatus; |
|||
import org.springframework.http.ResponseEntity; |
|||
import org.springframework.web.bind.annotation.GetMapping; |
|||
import org.springframework.web.bind.annotation.RequestMapping; |
|||
import org.springframework.web.bind.annotation.RequestParam; |
|||
import org.springframework.web.bind.annotation.RestController; |
|||
import org.springframework.web.client.HttpClientErrorException; |
|||
import org.springframework.web.client.HttpServerErrorException; |
|||
import org.springframework.web.client.ResourceAccessException; |
|||
import org.springframework.web.client.RestTemplate; |
|||
|
|||
import com.gcc.commissionerreview.configuration.AppConfig; |
|||
import com.gcc.commissionerreview.service.MasterShelterService; |
|||
import com.gcc.commissionerreview.service.ShelterInspectionService; |
|||
|
|||
|
|||
|
|||
|
|||
@RestController |
|||
@RequestMapping("/commissionerreview/api/shelterinspection") |
|||
public class ShelterInspectionController { |
|||
|
|||
@Autowired |
|||
private ShelterInspectionService shelterApiService; |
|||
|
|||
@Autowired |
|||
private MasterShelterService masterShelterService; |
|||
|
|||
private final RestTemplate restTemplate; |
|||
private final AppConfig appConfig; |
|||
|
|||
@Autowired |
|||
public ShelterInspectionController(RestTemplate restTemplate, AppConfig appConfig) { |
|||
this.restTemplate = restTemplate; |
|||
this.appConfig = appConfig; |
|||
} |
|||
|
|||
//private final RestTemplate restTemplate = new RestTemplate(); |
|||
|
|||
@GetMapping("/Sheltercount") |
|||
public ResponseEntity<Map<String, Object>> getTotalCount() { |
|||
|
|||
int count = shelterApiService.getTotalShelterCount(); |
|||
|
|||
Map<String, Object> response = new HashMap<>(); |
|||
response.put("totalShelterCount", count); |
|||
|
|||
return ResponseEntity.ok(response); |
|||
} |
|||
|
|||
@GetMapping("/dashboard") |
|||
public Map<String,Object> dashboard( |
|||
@RequestParam String type, |
|||
@RequestParam String value){ |
|||
|
|||
return shelterApiService.getDashboardData(type,value); |
|||
} |
|||
|
|||
@GetMapping("/top5Shelters") |
|||
public List<Map<String,Object>> top5Shelters( |
|||
@RequestParam String type, |
|||
@RequestParam String value){ |
|||
|
|||
return shelterApiService.getTop5Shelters(type,value); |
|||
} |
|||
|
|||
@GetMapping("/regionSummary") |
|||
public List<Map<String,Object>> regionSummary( |
|||
@RequestParam String type, |
|||
@RequestParam String value){ |
|||
|
|||
return shelterApiService.getRegionSummary(type,value); |
|||
} |
|||
|
|||
@GetMapping("/fundReceivedSummary") |
|||
public List<Map<String,Object>> fundSummary( |
|||
@RequestParam String type, |
|||
@RequestParam String value){ |
|||
|
|||
return shelterApiService.getFundReceivedSummary(type,value); |
|||
} |
|||
|
|||
@GetMapping("/fundReceivedShelterDetails") |
|||
public List<Map<String, Object>> fundReceivedShelterDetails( |
|||
@RequestParam String type, |
|||
@RequestParam String value) { |
|||
|
|||
return shelterApiService.getFundReceivedShelterDetails( type, value); |
|||
} |
|||
|
|||
@GetMapping("/monthlyTrends") |
|||
public List<Map<String,Object>> monthlyTrends( |
|||
@RequestParam String type, |
|||
@RequestParam String value){ |
|||
|
|||
return shelterApiService.getMonthlyTrends(type,value); |
|||
} |
|||
|
|||
@GetMapping("/weeklyVisits") |
|||
public List<Map<String,Object>> weeklyVisits( |
|||
@RequestParam String type, |
|||
@RequestParam String value){ |
|||
|
|||
List<Map<String,Object>> results = shelterApiService.getWeeklyVisits(type,value); |
|||
System.out.println("Weekly Visits Results:" +results); |
|||
|
|||
return results; |
|||
} |
|||
|
|||
@GetMapping("/latestVisitShelters") |
|||
public List<Map<String,Object>> latestVisitShelters( |
|||
@RequestParam String type, |
|||
@RequestParam String value){ |
|||
|
|||
return shelterApiService.getLatestVisitShelters(type,value); |
|||
} |
|||
|
|||
|
|||
@GetMapping("/shelterList") |
|||
public List<Map<String,Object>> shelterList( |
|||
@RequestParam(required = false) String zone, |
|||
@RequestParam(required = false) String category) { |
|||
return shelterApiService.getShelterList(zone, category); |
|||
|
|||
} |
|||
|
|||
@GetMapping("/visitList") |
|||
public List<Map<String,Object>> visitList( |
|||
@RequestParam(required=false) String fromDate, |
|||
@RequestParam(required=false) String toDate, |
|||
@RequestParam(required=false) String zone, |
|||
@RequestParam(required=false) String cdo){ |
|||
|
|||
return shelterApiService.getVisitList( fromDate, toDate, zone, cdo); |
|||
} |
|||
|
|||
@GetMapping("/visitDetails") |
|||
public Map<String,Object> visitDetails(@RequestParam String surveyId){ |
|||
return shelterApiService.getVisitDetails(surveyId); |
|||
} |
|||
|
|||
@GetMapping("/shelterVisitMinDate") |
|||
public String shelterResuceMinDate() { |
|||
return shelterApiService.getShelterVisitMinDate(); |
|||
} |
|||
|
|||
@GetMapping("/questions") |
|||
public ResponseEntity<?> getquestionsDetails( |
|||
@RequestParam("cid") String cid) { |
|||
|
|||
try { |
|||
|
|||
String apiUrl = |
|||
appConfig.shelterurl + "/questions?cid=" + cid; |
|||
|
|||
System.out.println( |
|||
"API URL for night inspection questions: " + apiUrl |
|||
); |
|||
|
|||
ResponseEntity<Object> response = |
|||
restTemplate.getForEntity( |
|||
apiUrl, |
|||
Object.class |
|||
); |
|||
|
|||
return ResponseEntity |
|||
.status(response.getStatusCode()) |
|||
.body(response.getBody()); |
|||
|
|||
} catch (HttpClientErrorException e) { |
|||
|
|||
System.out.println( |
|||
"Question API Client Error: " + |
|||
e.getStatusCode() |
|||
); |
|||
|
|||
return ResponseEntity |
|||
.status(e.getStatusCode()) |
|||
.body(e.getResponseBodyAsString()); |
|||
|
|||
} catch (HttpServerErrorException e) { |
|||
|
|||
System.out.println( |
|||
"Question API Server Error: " + |
|||
e.getStatusCode() |
|||
); |
|||
|
|||
return ResponseEntity |
|||
.status(e.getStatusCode()) |
|||
.body(e.getResponseBodyAsString()); |
|||
|
|||
} catch (ResourceAccessException e) { |
|||
|
|||
System.out.println( |
|||
"Question API Connection Error: " + |
|||
e.getMessage() |
|||
); |
|||
|
|||
return ResponseEntity |
|||
.status(HttpStatus.BAD_GATEWAY) |
|||
.body( |
|||
Map.of( |
|||
"status", false, |
|||
"message", |
|||
"Unable to connect to Question Master API." |
|||
) |
|||
); |
|||
|
|||
} catch (Exception e) { |
|||
|
|||
System.out.println( |
|||
"Question API Exception" |
|||
); |
|||
|
|||
e.printStackTrace(); |
|||
|
|||
return ResponseEntity |
|||
.status(HttpStatus.INTERNAL_SERVER_ERROR) |
|||
.body( |
|||
Map.of( |
|||
"status", false, |
|||
"message", |
|||
"Unable to load question details." |
|||
) |
|||
); |
|||
} |
|||
} |
|||
|
|||
|
|||
@GetMapping("/categories") |
|||
public List<String> getCategories() { |
|||
return masterShelterService.getCategoryList(); |
|||
} |
|||
|
|||
@GetMapping("/zones") |
|||
public List<String> getZones() { |
|||
return masterShelterService.getZoneList(); |
|||
} |
|||
|
|||
@GetMapping("/cdos") |
|||
public List<Map<String, Object>> getCdos() { |
|||
return masterShelterService.getCdos(); |
|||
} |
|||
|
|||
@GetMapping("/years") |
|||
public List<Integer> getYears() { |
|||
return masterShelterService.getAvailableYears(); |
|||
} |
|||
|
|||
|
|||
} |
|||
1181
src/main/java/com/gcc/commissionerreview/service/GccShelterService.java
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,139 @@ |
|||
package com.gcc.commissionerreview.service; |
|||
|
|||
|
|||
import java.util.Collections; |
|||
import java.util.Comparator; |
|||
|
|||
import java.util.List; |
|||
import java.util.Map; |
|||
import java.util.Objects; |
|||
import java.util.stream.Collectors; |
|||
|
|||
import javax.sql.DataSource; |
|||
|
|||
|
|||
|
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.beans.factory.annotation.Qualifier; |
|||
import org.springframework.core.ParameterizedTypeReference; |
|||
import org.springframework.http.HttpMethod; |
|||
import org.springframework.http.ResponseEntity; |
|||
import org.springframework.jdbc.core.JdbcTemplate; |
|||
import org.springframework.stereotype.Service; |
|||
import org.springframework.web.bind.annotation.GetMapping; |
|||
import org.springframework.web.client.RestTemplate; |
|||
|
|||
@Service |
|||
public class MasterShelterService { |
|||
|
|||
@Autowired |
|||
private JdbcTemplate jdbcTemplate; |
|||
|
|||
@Autowired |
|||
public void setDataSource(@Qualifier("mysqlShelterinspectionDataSource") DataSource dataSource) { |
|||
this.jdbcTemplate = new JdbcTemplate(dataSource); |
|||
} |
|||
|
|||
|
|||
private final RestTemplate restTemplate = new RestTemplate(); |
|||
|
|||
private static final String API_URL = "https://nightshelter.gccservices.in/api/shelters/"; |
|||
|
|||
// Category Dropdown |
|||
|
|||
public List<String> getCategoryList() { |
|||
|
|||
ResponseEntity<List<Map<String, Object>>> response = |
|||
restTemplate.exchange( |
|||
API_URL, |
|||
HttpMethod.GET, |
|||
null, |
|||
new ParameterizedTypeReference<List<Map<String, Object>>>() {}); |
|||
|
|||
List<Map<String, Object>> apiList = response.getBody(); |
|||
|
|||
if (apiList == null) { |
|||
return Collections.emptyList(); |
|||
} |
|||
|
|||
return apiList.stream() |
|||
.map(x -> String.valueOf(x.get("category"))) |
|||
.filter(Objects::nonNull) |
|||
.distinct() |
|||
.sorted() |
|||
.collect(Collectors.toList()); |
|||
} |
|||
|
|||
|
|||
//Zone Dropdown |
|||
|
|||
public List<String> getZoneList() { |
|||
|
|||
ResponseEntity<List<Map<String, Object>>> response = |
|||
restTemplate.exchange( |
|||
API_URL, |
|||
HttpMethod.GET, |
|||
null, |
|||
new ParameterizedTypeReference<List<Map<String, Object>>>() {}); |
|||
|
|||
List<Map<String, Object>> apiList = response.getBody(); |
|||
|
|||
if (apiList == null) { |
|||
return Collections.emptyList(); |
|||
} |
|||
|
|||
return apiList.stream() |
|||
.map(x -> String.valueOf(x.get("zone"))) |
|||
.filter(Objects::nonNull) |
|||
.distinct() |
|||
.sorted(Comparator.comparingInt(z -> |
|||
Integer.parseInt(z.replaceAll("[^0-9]", "")))) |
|||
.collect(Collectors.toList()); |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
//CDO Dropdown |
|||
|
|||
public List<Map<String,Object>> getCdos(){ |
|||
|
|||
String sql=""" |
|||
SELECT DISTINCT |
|||
uid, |
|||
user_name |
|||
FROM login_details |
|||
ORDER BY user_name |
|||
"""; |
|||
|
|||
return jdbcTemplate.queryForList(sql); |
|||
|
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
// Year Dropdown |
|||
|
|||
public List<Integer> getAvailableYears() { |
|||
|
|||
String sql = """ |
|||
SELECT DISTINCT YEAR(cdate) AS year |
|||
FROM night_shelter_inspection_response |
|||
WHERE isactive = 1 |
|||
AND isdelete = 0 |
|||
ORDER BY YEAR(cdate) DESC |
|||
"""; |
|||
|
|||
return jdbcTemplate.queryForList(sql, Integer.class); |
|||
} |
|||
|
|||
|
|||
|
|||
// SHelter List |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
} |
|||
1419
src/main/java/com/gcc/commissionerreview/service/ShelterInspectionService.java
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1 +1,2 @@ |
|||
spring.profiles.active=prod |
|||
#spring.profiles.active=dev |
|||
1891
src/main/resources/templates/modules/shelterinspection/complaintlist.html
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2809
src/main/resources/templates/modules/shelterinspection/dashboard.html
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1751
src/main/resources/templates/modules/shelterinspection/meetinglist.html
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
1848
src/main/resources/templates/modules/shelterinspection/resucelist.html
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,634 @@ |
|||
|
|||
<html lang="en" xmlns:th="http://www.thymeleaf.org"> |
|||
|
|||
<head> |
|||
<title>Shelter List</title> |
|||
|
|||
<!-- Bootstrap 5 CSS --> |
|||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"> |
|||
<!-- FontAwesome CSS for icons --> |
|||
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet"> |
|||
<!-- DataTables CSS --> |
|||
<link href="https://cdn.datatables.net/1.13.4/css/jquery.dataTables.min.css" rel="stylesheet" /> |
|||
<link href="https://cdn.datatables.net/buttons/2.3.6/css/buttons.dataTables.min.css" rel="stylesheet" /> |
|||
|
|||
<style> |
|||
body { |
|||
background-color: #f8f9fa; |
|||
} |
|||
|
|||
.page-header-title h4 { |
|||
margin: 20px 0; |
|||
text-align: center; |
|||
font-weight: bold; |
|||
color: #003366; |
|||
text-transform: uppercase; |
|||
} |
|||
|
|||
.filter-section { |
|||
background: #fff; |
|||
padding: 15px; |
|||
border-radius: 8px; |
|||
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05); |
|||
margin-bottom: 20px; |
|||
} |
|||
|
|||
thead th { |
|||
background-color: #003366 !important; |
|||
color: white !important; |
|||
} |
|||
|
|||
.report-container { |
|||
background: #fff; |
|||
padding: 15px; |
|||
border-radius: 8px; |
|||
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05); |
|||
} |
|||
|
|||
/* ============================== |
|||
DATATABLE ALIGNMENT |
|||
============================== */ |
|||
|
|||
#detailDataTable { |
|||
width: 100% !important; |
|||
table-layout: fixed !important; |
|||
border-collapse: collapse !important; |
|||
} |
|||
|
|||
#detailDataTable th, |
|||
#detailDataTable td { |
|||
box-sizing: border-box !important; |
|||
text-align: center !important; |
|||
vertical-align: middle !important; |
|||
border: 1px solid #dee2e6 !important; |
|||
} |
|||
|
|||
#detailDataTable thead th { |
|||
background-color: #003366 !important; |
|||
color: #ffffff !important; |
|||
white-space: normal !important; |
|||
word-break: normal !important; |
|||
padding: 10px 8px !important; |
|||
} |
|||
|
|||
#detailDataTable tbody td { |
|||
white-space: normal !important; |
|||
word-break: break-word !important; |
|||
overflow-wrap: anywhere !important; |
|||
padding: 8px !important; |
|||
} |
|||
|
|||
/* Column widths */ |
|||
#detailDataTable th:nth-child(1), |
|||
#detailDataTable td:nth-child(1) { |
|||
width: 6% !important; |
|||
} |
|||
|
|||
#detailDataTable th:nth-child(2), |
|||
#detailDataTable td:nth-child(2) { |
|||
width: 25% !important; |
|||
} |
|||
|
|||
#detailDataTable th:nth-child(3), |
|||
#detailDataTable td:nth-child(3) { |
|||
width: 9% !important; |
|||
} |
|||
|
|||
#detailDataTable th:nth-child(4), |
|||
#detailDataTable td:nth-child(4) { |
|||
width: 15% !important; |
|||
} |
|||
|
|||
#detailDataTable th:nth-child(5), |
|||
#detailDataTable td:nth-child(5) { |
|||
width: 9% !important; |
|||
} |
|||
|
|||
#detailDataTable th:nth-child(6), |
|||
#detailDataTable td:nth-child(6) { |
|||
width: 13% !important; |
|||
} |
|||
|
|||
#detailDataTable th:nth-child(7), |
|||
#detailDataTable td:nth-child(7) { |
|||
width: 14% !important; |
|||
} |
|||
|
|||
#detailDataTable th:nth-child(8), |
|||
#detailDataTable td:nth-child(8) { |
|||
width: 9% !important; |
|||
} |
|||
|
|||
|
|||
|
|||
</style> |
|||
</head> |
|||
|
|||
<body> |
|||
|
|||
<div class="container-fluid py-4"> |
|||
<div class="page-header-title d-flex justify-content-between align-items-center"> |
|||
<a href="/commissionerreview/shelterpagereport" class="btn btn-secondary"><i |
|||
class="fa-solid fa-arrow-left"></i> Back to Abstract</a> |
|||
<h4 class="mb-0 mx-auto">Shelter List</h4> |
|||
<div style="width: 100px;"></div> |
|||
</div> |
|||
|
|||
<!-- Filter Section --> |
|||
<div class="filter-section d-flex justify-content-center align-items-end gap-3 flex-wrap mt-3"> |
|||
<div> |
|||
<label for="zone" class="form-label fw-bold">Zone:</label> |
|||
<select id="zone" class="form-select"> |
|||
<option value="">All Zone</option> |
|||
</select> |
|||
</div> |
|||
<div> |
|||
<label for="category" class="form-label fw-bold">Category:</label> |
|||
<select id="category" class="form-select"> |
|||
<option value="">All Category</option> |
|||
</select> |
|||
</div> |
|||
<div> |
|||
<button id="btnSearch" class="btn btn-primary px-4"><i class="fa-solid fa-search"></i> Search</button> |
|||
</div> |
|||
<div> |
|||
<button class="btn btn-secondary px-4" onclick="resetFilters()"><i class="fa-solid fa-rotate-left"></i> Reset </button> |
|||
</div> |
|||
</div> |
|||
<div class="report-container"> |
|||
<table id="detailDataTable" class="table table-striped table-bordered display nowrap" style="width:100%;"> |
|||
<thead> |
|||
<tr> |
|||
<th class="text-center">S.No</th> |
|||
<th class="text-center">SHELTER</th> |
|||
<th class="text-center">ZONE</th> |
|||
<th class="text-center">CATEGORY</th> |
|||
<th class="text-center">RESIDENTS</th> |
|||
<th class="text-center">OCCUPANCY STATUS</th> |
|||
<th class="text-center">MAINTENANCE STATUS</th> |
|||
<th class="text-center">Latest Visit</th> |
|||
</tr> |
|||
</thead> |
|||
<tbody> |
|||
<!-- Populated via JS --> |
|||
</tbody> |
|||
</table> |
|||
</div> |
|||
</div> |
|||
|
|||
|
|||
|
|||
<!-- Scripts --> |
|||
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script> |
|||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script> |
|||
|
|||
<!-- DataTables JS --> |
|||
<script src="https://cdn.datatables.net/1.13.4/js/jquery.dataTables.min.js"></script> |
|||
<script src="https://cdn.datatables.net/buttons/2.3.6/js/dataTables.buttons.min.js"></script> |
|||
<script src="https://cdn.datatables.net/buttons/2.3.6/js/buttons.html5.min.js"></script> |
|||
<script src="https://cdn.datatables.net/buttons/2.3.6/js/buttons.print.min.js"></script> |
|||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.1.3/jszip.min.js"></script> |
|||
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/pdfmake.min.js"></script> |
|||
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/vfs_fonts.js"></script> |
|||
|
|||
<!-- SweetAlert --> |
|||
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script> |
|||
|
|||
<script th:inline="javascript"> |
|||
|
|||
var dataTable = null; |
|||
|
|||
$(document).ready(function () { |
|||
|
|||
// Load dropdowns |
|||
loadDropdowns(); |
|||
|
|||
// Initialize DataTable |
|||
dataTable = $('#detailDataTable').DataTable({ |
|||
|
|||
autoWidth: false, |
|||
|
|||
columnDefs: [ |
|||
{ width: "6%", targets: 0 }, |
|||
{ width: "25%", targets: 1 }, |
|||
{ width: "9%", targets: 2 }, |
|||
{ width: "15%", targets: 3 }, |
|||
{ width: "9%", targets: 4 }, |
|||
{ width: "13%", targets: 5 }, |
|||
{ width: "14%", targets: 6 }, |
|||
{ width: "9%", targets: 7 } |
|||
], |
|||
|
|||
|
|||
responsive: false, |
|||
scrollX: false, |
|||
/* scrollY: "60vh", |
|||
scrollCollapse: true, */ |
|||
searching: true, |
|||
paging: true, |
|||
info: true, |
|||
ordering: true, |
|||
dom: '<"d-flex justify-content-between align-items-center mb-3"lfB>rtip', |
|||
|
|||
lengthMenu: [ |
|||
[10, 25, 50, 100, -1], |
|||
[10, 25, 50, 100, "All"] |
|||
], |
|||
|
|||
buttons: [ |
|||
|
|||
{ |
|||
extend: 'excelHtml5', |
|||
text: '<i class="fa-solid fa-file-excel"></i> Excel', |
|||
className: 'btn btn-success btn-sm me-2', |
|||
|
|||
title: function () { |
|||
return 'Commissioner Review - Shelter Inspection'; |
|||
}, |
|||
|
|||
filename: function () { |
|||
|
|||
var zone = |
|||
$('#zone option:selected').text() |
|||
.replace(/[^a-zA-Z0-9]/g, '_'); |
|||
|
|||
var category = |
|||
$('#category option:selected').text() |
|||
.replace(/[^a-zA-Z0-9]/g, '_'); |
|||
|
|||
return 'Shelter_Inspection_' + |
|||
zone + '_' + |
|||
category; |
|||
}, |
|||
|
|||
exportOptions: { |
|||
stripHtml: true, |
|||
|
|||
format: { |
|||
body: function (data, row, column, node) { |
|||
var div = document.createElement("div"); |
|||
div.innerHTML = data; |
|||
return div.textContent || |
|||
div.innerText || |
|||
""; |
|||
} |
|||
} |
|||
} |
|||
}, |
|||
|
|||
{ |
|||
extend: 'pdfHtml5', |
|||
text: '<i class="fa-solid fa-file-pdf"></i> PDF', |
|||
className: 'btn btn-danger btn-sm', |
|||
orientation: 'landscape', |
|||
pageSize: 'A4', |
|||
title: function () { |
|||
return 'Commissioner Review - Shelter Inspection'; |
|||
}, |
|||
|
|||
filename: function () { |
|||
|
|||
var zone = |
|||
$('#zone option:selected').text() |
|||
.replace(/[^a-zA-Z0-9]/g, '_'); |
|||
|
|||
var category = |
|||
$('#category option:selected').text() |
|||
.replace(/[^a-zA-Z0-9]/g, '_'); |
|||
|
|||
return 'Shelter_Inspection_' + |
|||
zone + '_' + |
|||
category; |
|||
}, |
|||
|
|||
exportOptions: { |
|||
stripHtml: true, |
|||
|
|||
format: { |
|||
body: function (data, row, column, node) { |
|||
var div = document.createElement("div"); |
|||
div.innerHTML = data; |
|||
return div.textContent || |
|||
div.innerText || |
|||
""; |
|||
} |
|||
} |
|||
}, |
|||
|
|||
customize: function (doc) { |
|||
doc.styles.title = { |
|||
fontSize: 14, |
|||
bold: true, |
|||
alignment: 'center', |
|||
margin: [0, 0, 0, 10] |
|||
}; |
|||
doc.styles.tableHeader.fontSize = 9; |
|||
doc.styles.tableHeader.alignment = 'center'; |
|||
doc.defaultStyle.fontSize = 8; |
|||
doc.content[1].table.dontBreakRows = true; |
|||
} |
|||
} |
|||
|
|||
] |
|||
|
|||
}); |
|||
|
|||
|
|||
|
|||
|
|||
// Search button |
|||
$('#btnSearch').click(function () { |
|||
loadDetailedReport(); |
|||
}); |
|||
|
|||
|
|||
// Load data initially |
|||
loadDetailedReport(); |
|||
}); |
|||
|
|||
|
|||
|
|||
// ========================================================= |
|||
// LOAD DROPDOWNS |
|||
// ========================================================= |
|||
|
|||
function loadDropdowns() { |
|||
|
|||
// ------------------------- |
|||
// Zone |
|||
// ------------------------- |
|||
|
|||
$.ajax({ |
|||
url: "/commissionerreview/api/shelterinspection/zones", |
|||
type: "GET", |
|||
success: function (data) { |
|||
let options = |
|||
'<option value="">All Zones</option>'; |
|||
|
|||
data.forEach(function (zone) { |
|||
options += |
|||
'<option value="' + zone + '">' + |
|||
zone + |
|||
'</option>'; |
|||
}); |
|||
|
|||
$("#zone").html(options); |
|||
}, |
|||
|
|||
error: function () { |
|||
Swal.fire( |
|||
'Error', |
|||
'Unable to load zones.', |
|||
'error' |
|||
); |
|||
} |
|||
|
|||
}); |
|||
|
|||
|
|||
// ------------------------- |
|||
// Category |
|||
// ------------------------- |
|||
|
|||
$.ajax({ |
|||
url: "/commissionerreview/api/shelterinspection/categories", |
|||
type: "GET", |
|||
success: function (data) { |
|||
let options = |
|||
'<option value="">All Categories</option>'; |
|||
|
|||
data.forEach(function (category) { |
|||
let text = formatCategory(category); |
|||
options += |
|||
'<option value="' + category + '">' + |
|||
text + |
|||
'</option>'; |
|||
}); |
|||
|
|||
$("#category").html(options); |
|||
|
|||
}, |
|||
|
|||
error: function () { |
|||
Swal.fire( |
|||
'Error', |
|||
'Unable to load categories.', |
|||
'error' |
|||
); |
|||
} |
|||
}); |
|||
|
|||
} |
|||
|
|||
|
|||
|
|||
// ========================================================= |
|||
// LOAD SHELTER REPORT |
|||
// ========================================================= |
|||
|
|||
function loadDetailedReport() { |
|||
|
|||
var zone = |
|||
$('#zone').val() || ''; |
|||
|
|||
var category = |
|||
$('#category').val() || ''; |
|||
|
|||
|
|||
Swal.fire({ |
|||
title: 'Loading...', |
|||
allowOutsideClick: false, |
|||
didOpen: function () { |
|||
Swal.showLoading(); |
|||
} |
|||
}); |
|||
|
|||
|
|||
$.ajax({ |
|||
url: "/commissionerreview/api/shelterinspection/shelterList", |
|||
type: "GET", |
|||
data: { |
|||
zone: zone, |
|||
category: category |
|||
}, |
|||
|
|||
success: function (response) { |
|||
Swal.close(); |
|||
populateTable(response); |
|||
}, |
|||
|
|||
error: function () { |
|||
Swal.close(); |
|||
|
|||
Swal.fire({ |
|||
icon: 'error', |
|||
title: 'Error', |
|||
text: 'Unable to load shelter list.', |
|||
allowOutsideClick: false |
|||
}); |
|||
|
|||
} |
|||
|
|||
}); |
|||
|
|||
} |
|||
|
|||
|
|||
|
|||
// ========================================================= |
|||
// POPULATE TABLE |
|||
// ========================================================= |
|||
|
|||
function populateTable(data) { |
|||
|
|||
dataTable.clear(); |
|||
|
|||
if (!data || data.length === 0) { |
|||
dataTable.draw(); |
|||
return; |
|||
} |
|||
|
|||
|
|||
data.forEach(function (item, index) { |
|||
var shelterName = |
|||
item.shelterName || '-'; |
|||
var zone = |
|||
item.zone || '-'; |
|||
var category = |
|||
formatCategory(item.category); |
|||
var residents = |
|||
item.totalResidents || 0; |
|||
var occupancyStatus = |
|||
getStatusBadge(residents); |
|||
var maintenanceStatus = |
|||
getMaintenanceBadge( |
|||
item.maintenanceStatus |
|||
); |
|||
var latestVisit = |
|||
item.latestVisit || '-'; |
|||
|
|||
dataTable.row.add([ |
|||
index + 1, |
|||
'<strong>' + |
|||
shelterName + |
|||
'</strong>', |
|||
|
|||
zone, |
|||
category, |
|||
residents, |
|||
occupancyStatus, |
|||
maintenanceStatus, |
|||
latestVisit |
|||
]); |
|||
}); |
|||
|
|||
|
|||
dataTable.draw(); |
|||
|
|||
} |
|||
|
|||
|
|||
|
|||
// ========================================================= |
|||
// CATEGORY FORMAT |
|||
// ========================================================= |
|||
|
|||
function formatCategory(category) { |
|||
if (!category) { |
|||
return "-"; |
|||
} |
|||
|
|||
return category |
|||
.replace(/-/g, " ") |
|||
.replace(/\b\w/g, function (letter) { |
|||
return letter.toUpperCase(); |
|||
}); |
|||
} |
|||
|
|||
|
|||
|
|||
// ========================================================= |
|||
// OCCUPANCY STATUS |
|||
// ========================================================= |
|||
|
|||
function getStatusBadge(residents) { |
|||
|
|||
residents = parseInt(residents) || 0; |
|||
|
|||
if (residents >= 100) { |
|||
return '<span class="badge bg-success">Good</span>'; |
|||
} else if (residents >= 25) { |
|||
return '<span class="badge bg-warning text-dark">Average</span>'; |
|||
} else { |
|||
return '<span class="badge bg-danger">Poor</span>'; |
|||
} |
|||
} |
|||
|
|||
// ========================================================= |
|||
// MAINTENANCE STATUS |
|||
// ========================================================= |
|||
|
|||
function getMaintenanceBadge(status) { |
|||
|
|||
if (!status || status === "Not Available") { |
|||
|
|||
return '<span class="badge bg-secondary">' + |
|||
'Not Available' + |
|||
'</span>'; |
|||
|
|||
} |
|||
|
|||
if (status === "Well maintained") { |
|||
|
|||
return '<span class="badge bg-success">' + |
|||
'Well maintained' + |
|||
'</span>'; |
|||
|
|||
} |
|||
|
|||
if (status === "Averagely maintained") { |
|||
|
|||
return '<span class="badge bg-warning text-dark">' + |
|||
'Averagely maintained' + |
|||
'</span>'; |
|||
|
|||
} |
|||
|
|||
if (status === "Poorly maintained") { |
|||
|
|||
return '<span class="badge bg-danger">' + |
|||
'Poorly maintained' + |
|||
'</span>'; |
|||
|
|||
} |
|||
|
|||
if (status === "Extremely bad condition") { |
|||
|
|||
return '<span class="badge bg-dark">' + |
|||
'Extremely bad condition' + |
|||
'</span>'; |
|||
|
|||
} |
|||
|
|||
return '<span class="badge bg-secondary">' + |
|||
'Not Available' + |
|||
'</span>'; |
|||
} |
|||
|
|||
|
|||
// ========================================================= |
|||
// RESET FILTERS |
|||
// ========================================================= |
|||
|
|||
function resetFilters() { |
|||
$("#zone").val(""); |
|||
$("#category").val(""); |
|||
loadDetailedReport(); |
|||
} |
|||
|
|||
</script> |
|||
|
|||
|
|||
</body> |
|||
|
|||
</html> |
|||
2147
src/main/resources/templates/modules/shelterinspection/visitlist.html
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,389 @@ |
|||
<!DOCTYPE html> |
|||
<html lang="en" xmlns:th="http://www.thymeleaf.org"> |
|||
|
|||
<head> |
|||
<title>Shelter Report</title> |
|||
|
|||
<!-- Bootstrap 5 CSS --> |
|||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet"> |
|||
<!-- FontAwesome CSS for icons --> |
|||
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet"> |
|||
<!-- DataTables CSS --> |
|||
<link href="https://cdn.datatables.net/1.13.4/css/jquery.dataTables.min.css" rel="stylesheet" /> |
|||
<link href="https://cdn.datatables.net/buttons/2.3.6/css/buttons.dataTables.min.css" rel="stylesheet" /> |
|||
<link href="https://cdn.datatables.net/fixedcolumns/4.2.2/css/fixedColumns.dataTables.min.css" rel="stylesheet" /> |
|||
|
|||
|
|||
<style> |
|||
body { |
|||
background-color: #f8f9fa; |
|||
} |
|||
|
|||
.report-container { |
|||
overflow-x: auto; |
|||
} |
|||
|
|||
/*#hallBookingTable { |
|||
width: 100% !important; |
|||
}*/ |
|||
|
|||
.page-header-title h4 { |
|||
margin: 20px 0; |
|||
text-align: center; |
|||
font-weight: bold; |
|||
color: #003366; |
|||
text-transform: uppercase; |
|||
} |
|||
|
|||
.filter-section { |
|||
background: #fff; |
|||
padding: 15px; |
|||
border-radius: 8px; |
|||
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05); |
|||
margin-bottom: 20px; |
|||
} |
|||
|
|||
.report-container { |
|||
background: #fff; |
|||
padding: 15px; |
|||
border-radius: 8px; |
|||
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05); |
|||
} |
|||
|
|||
.dashboard-card { |
|||
height: 180px; |
|||
} |
|||
|
|||
.dashboard-card .card-body { |
|||
display: flex; |
|||
flex-direction: column; |
|||
justify-content: center; |
|||
} |
|||
|
|||
.category-card .card-body { |
|||
display: block; |
|||
overflow-y: auto; |
|||
height: 120px; |
|||
} |
|||
|
|||
thead th { |
|||
background-color: #003366 !important; |
|||
color: white !important; |
|||
} |
|||
|
|||
/* Horizontal Scroll */ |
|||
.dataTables_scrollBody { |
|||
overflow-x: auto !important; |
|||
overflow-y: auto !important; |
|||
} |
|||
|
|||
/* Fixed Column Background */ |
|||
table.dataTable tbody tr td.dtfc-fixed-left { |
|||
background-color: #fff !important; |
|||
} |
|||
|
|||
table.dataTable.table-striped tbody tr:nth-of-type(odd) td.dtfc-fixed-left { |
|||
background-color: #f9f9f9 !important; |
|||
} |
|||
|
|||
.dataTables_scrollBody { |
|||
overflow-x: auto !important; |
|||
overflow-y: auto !important; |
|||
} |
|||
|
|||
.select2-container { |
|||
width: 100% !important; |
|||
} |
|||
|
|||
.select2-results__options { |
|||
max-height: 400px !important; |
|||
/* increase height */ |
|||
} |
|||
|
|||
.select2-dropdown { |
|||
z-index: 9999 !important; |
|||
} |
|||
|
|||
|
|||
.hall-name-wrap { |
|||
min-width: 220px !important; |
|||
max-width: 220px !important; |
|||
white-space: normal !important; |
|||
word-break: break-word; |
|||
} |
|||
|
|||
.dashboard-card { |
|||
border: none; |
|||
border-radius: 12px; |
|||
min-height: 110px; |
|||
margin-bottom: 15px; |
|||
} |
|||
|
|||
/* Total Buildings */ |
|||
.building-card { |
|||
background: #E3F2FD; |
|||
color: #1565C0; |
|||
} |
|||
|
|||
/* Total Bookings */ |
|||
.booking-card { |
|||
background: #E8F5E9; |
|||
color: #2E7D32; |
|||
} |
|||
|
|||
/* Total Revenue */ |
|||
.revenue-card { |
|||
background: #FFF8E1; |
|||
color: #EF6C00; |
|||
} |
|||
|
|||
.distribute-card { |
|||
background: #FFF8E1; |
|||
color: #c9431a; |
|||
} |
|||
|
|||
.manage-card { |
|||
background: #FFF8E1; |
|||
color: #ac129a; |
|||
} |
|||
|
|||
.dashboard-card h6 { |
|||
font-size: 18px; |
|||
font-weight: 600; |
|||
margin-bottom: 15px; |
|||
} |
|||
|
|||
.dashboard-card h3 { |
|||
font-size: 42px; |
|||
font-weight: 700; |
|||
margin: 0; |
|||
} |
|||
|
|||
#bookingTable th:nth-child(8), |
|||
#bookingTable td:nth-child(8) { |
|||
width: 50px !important; |
|||
min-width: 50px !important; |
|||
max-width: 50px !important; |
|||
text-align: center; |
|||
} |
|||
|
|||
#bookingTable th:nth-child(9), |
|||
#bookingTable td:nth-child(9) { |
|||
width: 50px !important; |
|||
min-width: 50px !important; |
|||
max-width: 50px !important; |
|||
text-align: center; |
|||
} |
|||
|
|||
|
|||
|
|||
/* #hallBookingTable th:not(:nth-child(4)), |
|||
#hallBookingTable td:not(:nth-child(4)) { |
|||
white-space: nowrap; |
|||
}*/ |
|||
|
|||
/* Wrap selected columns */ |
|||
|
|||
.wrap { |
|||
white-space: normal !important; |
|||
word-break: break-word; |
|||
line-height: 1.2; |
|||
text-align: center; |
|||
vertical-align: middle; |
|||
min-width: 110px; |
|||
} |
|||
|
|||
#performanceTable thead tr:first-child th { |
|||
text-align: center; |
|||
vertical-align: middle; |
|||
background: #003366; |
|||
color: #fff; |
|||
} |
|||
|
|||
#performanceTable thead tr:nth-child(2) th { |
|||
text-align: center; |
|||
vertical-align: middle; |
|||
background: #0d6efd; |
|||
color: #fff; |
|||
} |
|||
|
|||
#performanceTable td { |
|||
text-align: center; |
|||
} |
|||
|
|||
#performanceTable td:nth-child(2) { |
|||
text-align: left; |
|||
} |
|||
|
|||
|
|||
|
|||
|
|||
/* Scrollbar */ |
|||
.dataTables_scrollBody::-webkit-scrollbar { |
|||
height: 8px; |
|||
} |
|||
|
|||
.dataTables_scrollBody::-webkit-scrollbar-thumb { |
|||
background: #c1c1c1; |
|||
border-radius: 4px; |
|||
} |
|||
|
|||
.dataTables_scrollBody::-webkit-scrollbar-track { |
|||
background: #f1f1f1; |
|||
} |
|||
</style> |
|||
</head> |
|||
|
|||
<body> |
|||
|
|||
<div class="container-fluid py-4"> |
|||
<div class="page-header-title"> |
|||
<h4>Shelter Report</h4> |
|||
</div> |
|||
<div class="row mb-4"> |
|||
|
|||
<!-- Card 1 --> |
|||
<div class="col-md-4"> |
|||
<div class="card dashboard-card building-card shadow" style="cursor:pointer;" |
|||
onclick="window.open('/commissionerreview/shelterlist', '_blank');"> |
|||
<!-- onclick="window.open('https://gccservices.in/commissionerreview/feedbackreport', '_blank');" --> |
|||
<div class="card-body text-center"> |
|||
<h6>Shelter Report</h6> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<!-- Card 2 --> |
|||
<div class="col-md-4"> |
|||
<div class="card dashboard-card booking-card shadow" style="cursor:pointer;" |
|||
onclick="window.open('/commissionerreview/visitlist', '_blank');"> |
|||
<!-- onclick="window.open('https://gccservices.in/commissionerreview/feedbackreport', '_blank');" --> |
|||
<div class="card-body text-center"> |
|||
<h6>Shelter Visit Report</h6> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<!-- Card 3 --> |
|||
<div class="col-md-4"> |
|||
<div class="card dashboard-card revenue-card shadow" style="cursor:pointer;" |
|||
onclick="window.open('/commissionerreview/complaintlist', '_blank');"> |
|||
<!-- onclick="window.open('https://gccservices.in/commissionerreview/feedbackreport', '_blank');" --> |
|||
<div class="card-body text-center"> |
|||
<h6>Shelter Complaint Report</h6> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
|
|||
<div class="col-md-4"> |
|||
<div class="card dashboard-card manage-card shadow" style="cursor:pointer;" |
|||
onclick="window.open('/commissionerreview/meetinglist', '_blank');"> |
|||
<!-- onclick="window.open('https://gccservices.in/commissionerreview/fooddistributionreport', '_blank');" --> |
|||
<div class="card-body text-center"> |
|||
<h6>Shelter Meeting Report</h6> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-md-4"> |
|||
<div class="card dashboard-card distribute-card shadow" style="cursor:pointer;" |
|||
onclick="window.open('/commissionerreview/resucelist', '_blank');" |
|||
> |
|||
<!-- onclick="window.open('https://gccservices.in/commissionerreview/fooddistributiondetailedreport', '_blank');" --> |
|||
<div class="card-body text-center"> |
|||
<h6>Shelter Resuce Report</h6> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
</div> |
|||
|
|||
<!--<div class="col-md-3"> |
|||
<div class="card bg-primary text-white shadow dashboard-card"> |
|||
<div class="card-body text-center"> |
|||
<h6>Total Buildings</h6> |
|||
<h3 id="totalBuildings">0</h3> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-md-3"> |
|||
<div class="card bg-success text-white shadow dashboard-card"> |
|||
<div class="card-body text-center"> |
|||
<h6>Total Bookings</h6> |
|||
<h3 id="totalBookings">0</h3> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
<div class="col-md-3"> |
|||
<div class="card bg-warning text-dark shadow dashboard-card"> |
|||
<div class="card-body text-center"> |
|||
<h6>Total Revenue</h6> |
|||
<h3 id="totalRevenue">0</h3> |
|||
</div> |
|||
</div> |
|||
</div>--> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<!-- Media Modal --> |
|||
<div class="modal fade" id="mediaModal" tabindex="-1" aria-labelledby="mediaModalLabel" aria-hidden="true" |
|||
style="z-index: 1060;"> |
|||
<div class="modal-dialog modal-lg modal-dialog-centered"> |
|||
<div class="modal-content"> |
|||
<div class="modal-header"> |
|||
<h5 class="modal-title" id="mediaModalLabel">Media Viewer</h5> |
|||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button> |
|||
</div> |
|||
<div class="modal-body text-center" id="mediaModalBody"> |
|||
</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"></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> |
|||
|
|||
<!-- Scripts --> |
|||
|
|||
<script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script> |
|||
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" /> |
|||
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script> |
|||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script> |
|||
|
|||
|
|||
<!-- DataTables JS --> |
|||
<script src="https://cdn.datatables.net/1.13.4/js/jquery.dataTables.min.js"></script> |
|||
<script src="https://cdn.datatables.net/buttons/2.3.6/js/dataTables.buttons.min.js"></script> |
|||
<script src="https://cdn.datatables.net/buttons/2.3.6/js/buttons.html5.min.js"></script> |
|||
<script src="https://cdn.datatables.net/buttons/2.3.6/js/buttons.print.min.js"></script> |
|||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.1.3/jszip.min.js"></script> |
|||
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/pdfmake.min.js"></script> |
|||
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.2.7/vfs_fonts.js"></script> |
|||
<script src="https://cdn.jsdelivr.net/npm/xlsx@0.18.5/dist/xlsx.full.min.js"></script> |
|||
<script src="https://cdn.datatables.net/fixedcolumns/4.2.2/js/dataTables.fixedColumns.min.js"></script> |
|||
|
|||
<!-- SweetAlert --> |
|||
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script> |
|||
|
|||
<script th:inline="none"> |
|||
|
|||
</script> |
|||
|
|||
</body> |
|||
|
|||
</html> |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue