2 Commits

Author SHA1 Message Date
Balaji 1d865bbbcc MTM Mayor Module Updated 3 years ago
Balaji b586ca0bc8 App Security Updated 3 years ago
  1. BIN
      .DS_Store
  2. BIN
      src/.DS_Store
  3. 2
      src/main/java/in/gov/chennaicorporation/gccoffice/configuration/DataSourceConfig.java
  4. 6
      src/main/java/in/gov/chennaicorporation/gccoffice/configuration/SecurityConfig.java
  5. 39
      src/main/java/in/gov/chennaicorporation/gccoffice/configuration/WebMvcConfig.java
  6. 18
      src/main/java/in/gov/chennaicorporation/gccoffice/controller/CustomErrorController.java
  7. 283
      src/main/java/in/gov/chennaicorporation/gccoffice/interceptor/AppInterceptor.java
  8. 44
      src/main/java/in/gov/chennaicorporation/gccoffice/mtm/controller/MayorController.java
  9. 191
      src/main/java/in/gov/chennaicorporation/gccoffice/mtm/data/MTMOfficer.java
  10. 3
      src/main/java/in/gov/chennaicorporation/gccoffice/repository/AppModuleAccessRepository.java
  11. 3
      src/main/java/in/gov/chennaicorporation/gccoffice/repository/AppModuleRepository.java
  12. 4
      src/main/java/in/gov/chennaicorporation/gccoffice/repository/MenuItemAccessRepository.java
  13. 5
      src/main/java/in/gov/chennaicorporation/gccoffice/repository/MenuItemRepository.java
  14. 6
      src/main/java/in/gov/chennaicorporation/gccoffice/repository/SubMenuItemAccessRepository.java
  15. 4
      src/main/java/in/gov/chennaicorporation/gccoffice/repository/SubMenuItemRepository.java
  16. 4
      src/main/resources/application.properties
  17. BIN
      src/main/resources/static/assets/.DS_Store
  18. BIN
      src/main/resources/static/assets/images/403.png
  19. 57
      src/main/resources/templates/error-403.html
  20. 4
      src/main/resources/templates/fragments/modules/mtm/event_search_form.html
  21. 38
      src/main/resources/templates/index.html
  22. 2
      src/main/resources/templates/modules/mtm/mayor/by-event-list.html
  23. 186
      src/main/resources/templates/modules/mtm/mayor/by-officer-list.html

BIN
.DS_Store

BIN
src/.DS_Store

2
src/main/java/in/gov/chennaicorporation/gccoffice/configuration/DataSourceConfig.java

@ -35,7 +35,7 @@ public class DataSourceConfig {
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/gcc_apps");
dataSource.setUsername("root");
dataSource.setPassword("");
dataSource.setPassword("1");
return dataSource;
}
/*

6
src/main/java/in/gov/chennaicorporation/gccoffice/configuration/SecurityConfig.java

@ -57,7 +57,11 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
.and()
.logout()
.logoutUrl("/logout") // Include the logout URL
.logoutSuccessUrl("/login"); // Include the success logout URL
.logoutSuccessUrl("/login") // Include the success logout URL
.and()
.sessionManagement()
.sessionFixation()
.migrateSession(); // or .none(), .newSession()
}

39
src/main/java/in/gov/chennaicorporation/gccoffice/configuration/WebMvcConfig.java

@ -10,19 +10,52 @@ import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import in.gov.chennaicorporation.gccoffice.interceptor.AppInterceptor;
import in.gov.chennaicorporation.gccoffice.repository.AppModuleAccessRepository;
import in.gov.chennaicorporation.gccoffice.repository.AppModuleRepository;
import in.gov.chennaicorporation.gccoffice.repository.MenuItemAccessRepository;
import in.gov.chennaicorporation.gccoffice.repository.MenuItemRepository;
import in.gov.chennaicorporation.gccoffice.repository.SubMenuItemAccessRepository;
import in.gov.chennaicorporation.gccoffice.repository.SubMenuItemRepository;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
private final String uploadDirectory;
private AppModuleAccessRepository appModuleAccessRepository;
private MenuItemAccessRepository menuItemAccessRepository;
private SubMenuItemAccessRepository subMenuItemAccessRepository;
private AppModuleRepository appModuleRepository;
private MenuItemRepository menuItemRepository;
private SubMenuItemRepository subMenuItemRepository;
@Autowired
public WebMvcConfig(
@Value("${file.upload.directory}") String uploadDirectory) {
public WebMvcConfig(
@Value("${file.upload.directory}") String uploadDirectory,
AppModuleAccessRepository appModuleAccessRepository,
MenuItemAccessRepository menuItemAccessRepository,
SubMenuItemAccessRepository subMenuItemAccessRepository,
AppModuleRepository appModuleRepository,
MenuItemRepository menuItemRepository,
SubMenuItemRepository subMenuItemRepository) {
this.uploadDirectory = uploadDirectory;
this.appModuleAccessRepository = appModuleAccessRepository;
this.menuItemAccessRepository = menuItemAccessRepository;
this.subMenuItemAccessRepository = subMenuItemAccessRepository;
this.appModuleRepository = appModuleRepository;
this.menuItemRepository = menuItemRepository;
this.subMenuItemRepository = subMenuItemRepository;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AppInterceptor());
registry.addInterceptor(new AppInterceptor(
appModuleAccessRepository,
menuItemAccessRepository,
subMenuItemAccessRepository,
appModuleRepository,
menuItemRepository,
subMenuItemRepository));
}
@Override

18
src/main/java/in/gov/chennaicorporation/gccoffice/controller/CustomErrorController.java

@ -23,9 +23,25 @@ public class CustomErrorController implements ErrorController {
@RequestMapping(value = ERROR_PATH, produces = "text/html")
public String handleWebError(HttpServletRequest request, Model model) {
// Retrieve error information from the request
HttpStatus status = HttpStatus.valueOf((Integer) request.getAttribute("javax.servlet.error.status_code"));
// HttpStatus status = HttpStatus.valueOf((Integer) request.getAttribute("javax.servlet.error.status_code"));
//Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception");
// Retrieve error information from the request
Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
if (statusCode == null) {
// Add the error message to the model
model.addAttribute("errorStatus", "Error 403");
model.addAttribute("errorError", "403 - Access Denied");
model.addAttribute("errorMessage", "Oops, You don`t have permission to access this page.");
// Handle the case where the status code is null
// You may choose to set default values or redirect to a generic error page
return "error-403";
}
HttpStatus status = (statusCode != null) ? HttpStatus.valueOf(statusCode) : HttpStatus.INTERNAL_SERVER_ERROR;
Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception");
// Add custom error handling logic for web applications here
String errorPage = "error";
Integer errorStatus = 404;

283
src/main/java/in/gov/chennaicorporation/gccoffice/interceptor/AppInterceptor.java

@ -1,5 +1,6 @@
package in.gov.chennaicorporation.gccoffice.interceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
@ -8,31 +9,271 @@ import org.springframework.security.web.util.matcher.RequestMatcher;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import in.gov.chennaicorporation.gccoffice.entity.AppModuleAccessEntity;
import in.gov.chennaicorporation.gccoffice.entity.AppModuleEntity;
import in.gov.chennaicorporation.gccoffice.entity.MenuItemAccessEntity;
import in.gov.chennaicorporation.gccoffice.entity.MenuItemEntity;
import in.gov.chennaicorporation.gccoffice.entity.SubMenuItemAccessEntity;
import in.gov.chennaicorporation.gccoffice.entity.SubMenuItemEntity;
import in.gov.chennaicorporation.gccoffice.repository.AppModuleAccessRepository;
import in.gov.chennaicorporation.gccoffice.repository.AppModuleRepository;
import in.gov.chennaicorporation.gccoffice.repository.MenuItemAccessRepository;
import in.gov.chennaicorporation.gccoffice.repository.MenuItemRepository;
import in.gov.chennaicorporation.gccoffice.repository.SubMenuItemAccessRepository;
import in.gov.chennaicorporation.gccoffice.repository.SubMenuItemRepository;
import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AppInterceptor implements HandlerInterceptor {
List<AppModuleAccessEntity> getAppModuleAccessEntities;
List<MenuItemAccessEntity> getMenuItemAccessEntities;
List<SubMenuItemAccessEntity> getSubMenuItemAccessEntities;
private AppModuleAccessRepository appModuleAccessRepository;
private MenuItemAccessRepository menuItemAccessRepository;
private SubMenuItemAccessRepository subMenuItemAccessRepository;
List<AppModuleEntity> getAppModuleEntities;
List<MenuItemEntity> getMenuItemEntities;
List<SubMenuItemEntity> getSubMenuItemEntities;
private AppModuleRepository appModuleRepository;
private MenuItemRepository menuItemRepository;
private SubMenuItemRepository subMenuItemRepository;
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// Create a RequestMatcher for login and error URLs
RequestMatcher loginPageMatcher = new AntPathRequestMatcher("/login");
RequestMatcher errorPageMatcher = new AntPathRequestMatcher("/error");
// Check if the current request matches the login or error page URLs
if (!loginPageMatcher.matches(request) && !errorPageMatcher.matches(request)) {
if (modelAndView != null) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null && authentication.isAuthenticated()) {
Object principal = authentication.getPrincipal();
if (principal instanceof UserDetails) {
UserDetails userDetails = (UserDetails) principal;
modelAndView.addObject("currentUserDetails", userDetails);
//System.out.println(userDetails.getAuthorities());
}
}
}
@Autowired
public AppInterceptor(AppModuleAccessRepository appModuleAccessRepository,
MenuItemAccessRepository menuItemAccessRepository,
SubMenuItemAccessRepository subMenuItemAccessRepository,
AppModuleRepository appModuleRepository,
MenuItemRepository menuItemRepository,
SubMenuItemRepository subMenuItemRepository) {
this.appModuleAccessRepository = appModuleAccessRepository;
this.menuItemAccessRepository = menuItemAccessRepository;
this.subMenuItemAccessRepository = subMenuItemAccessRepository;
this.appModuleRepository = appModuleRepository;
this.menuItemRepository = menuItemRepository;
this.subMenuItemRepository = subMenuItemRepository;
}
private boolean isLoginPage(HttpServletRequest request) {
RequestMatcher loginPageMatcher = new AntPathRequestMatcher("/login");
return loginPageMatcher.matches(request);
}
private boolean isErrorPage(HttpServletRequest request) {
RequestMatcher errorPageMatcher = new AntPathRequestMatcher("/error");
return errorPageMatcher.matches(request);
}
private boolean isfavicon(HttpServletRequest request) {
RequestMatcher loginPageMatcher = new AntPathRequestMatcher("/favicon.ico");
return loginPageMatcher.matches(request);
}
public static String[] Split(String request,String patten) {
String path = request;
// Split the string by "/"
String[] parts = path.split(patten);
/*
// Display the parts
for (String part : parts) {
System.out.println(part);
}
*/
return parts;
}
private boolean hasModuleAccess(String moduleName) {
getAppModuleEntities = appModuleRepository.findByModulePath(moduleName);
System.out.println("DataTable Size for the url ("+moduleName+"): "+getAppModuleEntities.size());
String moduleid = null;
if(getAppModuleEntities.size()>0) {
for ( AppModuleEntity appModuleEntity : getAppModuleEntities) {
moduleid = appModuleEntity.getId().toString();
}
if(moduleid != null) {
String userGroupId = LoginUserInfo.getUserGroupId();
System.out.println("Query input`s :\n userGroupId : "+userGroupId+"\n moduleid : "+moduleid);
getAppModuleAccessEntities = appModuleAccessRepository.findByAll(userGroupId,moduleid);
if(getAppModuleAccessEntities.size()>0) {
return true;
}
}
}
return false;
}
private boolean hasMenuAccess(String url,String moduleName,String menuName) {
if(!hasModuleAccess(moduleName)) {return false; }
getMenuItemEntities = menuItemRepository.findByUrl(url);
System.out.println("DataTable Size for the url ("+url+"): "+getMenuItemEntities.size());
String moduleid = null;
String menuid = null;
if(getMenuItemEntities.size()>0) {
for (MenuItemEntity MenuEntity : getMenuItemEntities) {
moduleid = MenuEntity.getModuleId().getId().toString();
menuid = MenuEntity.getId().toString();
}
if(moduleid != null && menuid != null) {
String userGroupId = LoginUserInfo.getUserGroupId();
System.out.println("Query input`s :\n userGroupId : "+userGroupId+"\n moduleid : "+moduleid+"\n menuid : "+menuid);
getMenuItemAccessEntities = menuItemAccessRepository.findByAll(userGroupId,moduleid,menuid);
if(getMenuItemAccessEntities.size()>0) {
return true;
}
}
}
return false;
}
private boolean hasSubMenuAccess(String url,String moduleName,String menuName,String subMenuName) {
if(!hasModuleAccess(moduleName)) {return false; }
getSubMenuItemEntities = subMenuItemRepository.findByUrl(url);
System.out.println("DataTable Size for the url ("+url+"): "+getSubMenuItemEntities.size());
String moduleid = null;
String menuid = null;
String submenuid = null;
if(getSubMenuItemEntities.size()>0) {
for (SubMenuItemEntity subMenuEntity : getSubMenuItemEntities) {
moduleid = subMenuEntity.getModuleId().getId().toString();
menuid = subMenuEntity.getMenuItemId().getId().toString();
submenuid = subMenuEntity.getId().toString();
}
if(moduleid != null && menuid != null && submenuid != null) {
String userGroupId = LoginUserInfo.getUserGroupId();
System.out.println("Query input`s :\n userGroupId : "+userGroupId+"\n moduleid : "+moduleid+"\n menuid : "+menuid+"\n submenuid : "+submenuid);
getSubMenuItemAccessEntities = subMenuItemAccessRepository.findByAll(userGroupId,moduleid,menuid,submenuid);
if(getSubMenuItemAccessEntities.size()>0) {
// Check Parent Menu Access (Menu Access)
if(moduleid != null && menuid != null) {
System.out.println("Query input`s :\n userGroupId : "+userGroupId+"\n moduleid : "+moduleid+"\n menuid : "+menuid);
getMenuItemAccessEntities = menuItemAccessRepository.findByAll(userGroupId,moduleid,menuid);
if(getMenuItemAccessEntities.size()>0) {
return true;
}
}
}
}
}
return false;
}
private boolean hasAccess(String path) {
if(LoginUserInfo.getUserRole().equals("ADMIN")) {
return true;
}
String url = removeLeadingSlash(path);
System.out.println("Give URL : "+path+" After remove leading slash : "+url);
// If default home page
if(path.equals("/")) {
return true;
}
//continue for access check
String[] parts = Split(url, "/");
if(parts.length<=0) {return true;}
System.out.println(parts.length);
if(parts.length>0) {
int j=0;
for (String part : parts) {
System.out.println(j+") URL SPLIT: "+part);
j++;
}
String moduleName = "";
String menuName = "";
String subMenuName = "";
if(parts.length==1) { // Check Only Module Access
moduleName = parts[0];
return hasModuleAccess(moduleName);
}
else if(parts.length==2) { // Check Module & Menu Access
moduleName = parts[0];
menuName = parts[1];
subMenuName = "";
return hasMenuAccess(url,moduleName,menuName);
}
else if(parts.length==3) { // Check Module , Menu & Sub-Menu Access
moduleName = parts[0];
menuName = parts[1];
subMenuName = parts[2];
return hasSubMenuAccess(url,moduleName,menuName,subMenuName);
}
}
return false;
}
public static String removeLeadingSlash(String input) {
if (input.startsWith("/")) {
return input.substring(1);
}
return input;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (!isLoginPage(request) && !isErrorPage(request) && !isfavicon(request)) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null && authentication.isAuthenticated()) {
String fullRequestURI = request.getRequestURI();
String contextPath = request.getContextPath();
String path = fullRequestURI.substring(contextPath.length());
if(!hasAccess(path)) {
Object principal = authentication.getPrincipal();
UserDetails userDetails = (UserDetails) principal;
System.out.println("1) Access Deny For --- " + userDetails.getAuthorities().toString());
// Redirect to the error page
//response.sendRedirect(request.getContextPath() + "/error");
request.getRequestDispatcher("/error").forward(request, response);
}
}
}
// Continue with the request processing
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// Check if the current request matches the login or error page URLs
if (!isLoginPage(request) && !isErrorPage(request) && !isfavicon(request)) {
if (modelAndView != null) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null && authentication.isAuthenticated()) {
Object principal = authentication.getPrincipal();
if (principal instanceof UserDetails) {
UserDetails userDetails = (UserDetails) principal;
modelAndView.addObject("currentUserDetails", userDetails);
}
}
}
}
}
}
}

44
src/main/java/in/gov/chennaicorporation/gccoffice/mtm/controller/MayorController.java

@ -1,40 +1,22 @@
package in.gov.chennaicorporation.gccoffice.mtm.controller;
import java.util.Arrays;
import java.util.List;
import javax.servlet.http.HttpSession;
import javax.websocket.Session;
import org.apache.catalina.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
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.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import com.fasterxml.jackson.databind.JsonNode;
import in.gov.chennaicorporation.gccoffice.configuration.AppConfig;
import in.gov.chennaicorporation.gccoffice.controller.login;
import in.gov.chennaicorporation.gccoffice.mtm.data.MtmComplaintTypes;
import in.gov.chennaicorporation.gccoffice.mtm.data.MTMOfficer;
import in.gov.chennaicorporation.gccoffice.mtm.data.MtmEvent;
import in.gov.chennaicorporation.gccoffice.mtm.data.Petition;
import in.gov.chennaicorporation.gccoffice.mtm.data.PetitionComplaint;
import in.gov.chennaicorporation.gccoffice.petregistration.data.RequestList;
import in.gov.chennaicorporation.gccoffice.qrassetfeedback.data.Asset;
import in.gov.chennaicorporation.gccoffice.qrassetfeedback.data.AssetCategory;
import in.gov.chennaicorporation.gccoffice.qrassetfeedback.data.AssetCategoryQuestion;
import in.gov.chennaicorporation.gccoffice.qrassetfeedback.data.AssetParameter;
import in.gov.chennaicorporation.gccoffice.qrassetfeedback.data.AssetParameterQuestions;
import in.gov.chennaicorporation.gccoffice.qrassetfeedback.data.AssetQuestion;
import in.gov.chennaicorporation.gccoffice.qrassetfeedback.data.Feedback;
import in.gov.chennaicorporation.gccoffice.service.LoginUserInfo;
@RequestMapping("/mtm/mayor")
@ -269,4 +251,26 @@ public class MayorController {
return basePath+"/by-event-list";
}
@GetMapping({"/by-officer-list"})
public String showOfficerListReport(Model model,HttpSession session) {
String eventid = "0";
if(session.getAttribute("eventid")!= null && !session.getAttribute("eventid").equals("0")){
eventid = session.getAttribute("eventid").toString();
}
String baseUrl = appConfig.mtm + "/api/mayor/by-officer-list";
UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(baseUrl)
.queryParam("mtmid",eventid);
MTMOfficer[] officerTableList = restTemplate.getForObject(builder.toUriString(), MTMOfficer[].class);
model.addAttribute("officerTableList",officerTableList);
baseUrl = appConfig.mtm + "/api/event-list";
MtmEvent[] mtmEventsList = restTemplate.getForObject(baseUrl, MtmEvent[].class);
model.addAttribute("mtmEventsList",mtmEventsList);
return basePath+"/by-officer-list";
}
}

191
src/main/java/in/gov/chennaicorporation/gccoffice/mtm/data/MTMOfficer.java

@ -0,0 +1,191 @@
package in.gov.chennaicorporation.gccoffice.mtm.data;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
public class MTMOfficer {
private String mapId;
private String petitionNumber;
private String mtmEventsPetitionId;
private String mtmEvents;
private String offID;
private String status;
private String mtmComplaintTypes;
private String isDelete;
private String isActive;
private String createdBy;
private String cDate;
private String officerName;
private String eventName;
private String officerPetitionCount;
private String officerCompletedCount;
private String officerPendingCount;
@JsonCreator
public MTMOfficer(
@JsonProperty("mapId") String mapId,
@JsonProperty("petitionNumber") String petitionNumber,
@JsonProperty("mtmEventsPetitionId") String mtmEventsPetitionId,
@JsonProperty("mtmEvents") String mtmEvents,
@JsonProperty("offID") String offID,
@JsonProperty("status") String status,
@JsonProperty("mtmComplaintTypes") String mtmComplaintTypes,
@JsonProperty("isDelete") String isDelete,
@JsonProperty("isActive") String isActive,
@JsonProperty("createdBy") String createdBy,
@JsonProperty("cDate") String cDate,
@JsonProperty("officer_name") String officerName,
@JsonProperty("event_name") String eventName,
@JsonProperty("officer_petition_count") String officerPetitionCount,
@JsonProperty("officer_completed_count") String officerCompletedCount,
@JsonProperty("officer_pending_count") String officerPendingCount
) {
this.mapId = mapId;
this.petitionNumber = petitionNumber;
this.mtmEventsPetitionId = mtmEventsPetitionId;
this.mtmEvents = mtmEvents;
this.offID = offID;
this.status = status;
this.mtmComplaintTypes = mtmComplaintTypes;
this.isDelete = isDelete;
this.isActive = isActive;
this.createdBy = createdBy;
this.cDate = cDate;
this.officerName = officerName;
this.eventName = eventName;
this.officerPetitionCount = officerPetitionCount;
this.officerCompletedCount = officerCompletedCount;
this.officerPendingCount = officerPendingCount;
}
public String getMapId() {
return mapId;
}
public void setMapId(String mapId) {
this.mapId = mapId;
}
public String getPetitionNumber() {
return petitionNumber;
}
public void setPetitionNumber(String petitionNumber) {
this.petitionNumber = petitionNumber;
}
public String getMtmEventsPetitionId() {
return mtmEventsPetitionId;
}
public void setMtmEventsPetitionId(String mtmEventsPetitionId) {
this.mtmEventsPetitionId = mtmEventsPetitionId;
}
public String getMtmEvents() {
return mtmEvents;
}
public void setMtmEvents(String mtmEvents) {
this.mtmEvents = mtmEvents;
}
public String getOffID() {
return offID;
}
public void setOffID(String offID) {
this.offID = offID;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getMtmComplaintTypes() {
return mtmComplaintTypes;
}
public void setMtmComplaintTypes(String mtmComplaintTypes) {
this.mtmComplaintTypes = mtmComplaintTypes;
}
public String getIsDelete() {
return isDelete;
}
public void setIsDelete(String isDelete) {
this.isDelete = isDelete;
}
public String getIsActive() {
return isActive;
}
public void setIsActive(String isActive) {
this.isActive = isActive;
}
public String getCreatedBy() {
return createdBy;
}
public void setCreatedBy(String createdBy) {
this.createdBy = createdBy;
}
public String getcDate() {
return cDate;
}
public void setcDate(String cDate) {
this.cDate = cDate;
}
public String getOfficerName() {
return officerName;
}
public void setOfficerName(String officerName) {
this.officerName = officerName;
}
public String getEventName() {
return eventName;
}
public void setEventName(String eventName) {
this.eventName = eventName;
}
public String getOfficerPetitionCount() {
return officerPetitionCount;
}
public void setOfficerPetitionCount(String officerPetitionCount) {
this.officerPetitionCount = officerPetitionCount;
}
public String getOfficerCompletedCount() {
return officerCompletedCount;
}
public void setOfficerCompletedCount(String officerCompletedCount) {
this.officerCompletedCount = officerCompletedCount;
}
public String getOfficerPendingCount() {
return officerPendingCount;
}
public void setOfficerPendingCount(String officerPendingCount) {
this.officerPendingCount = officerPendingCount;
}
}

3
src/main/java/in/gov/chennaicorporation/gccoffice/repository/AppModuleAccessRepository.java

@ -20,4 +20,7 @@ public interface AppModuleAccessRepository extends JpaRepository<AppModuleAccess
@Query(value = "SELECT * FROM `modules_access` WHERE `usergroup_id`=:usergroup_id AND `isactive`=1 AND `isdelete`=0", nativeQuery = true)
List<AppModuleAccessEntity> findByUserGroupID(@Param("usergroup_id") String usergroup_id);
@Query(value = "SELECT * FROM `modules_access` WHERE (`usergroup_id`=:usergroup_id AND `module_id`=:module_id) AND (`isactive`=1 AND `isdelete`=0)", nativeQuery = true)
List<AppModuleAccessEntity> findByAll(@Param("usergroup_id") String usergroup_id,@Param("module_id") String module_id);
}

3
src/main/java/in/gov/chennaicorporation/gccoffice/repository/AppModuleRepository.java

@ -21,4 +21,7 @@ public interface AppModuleRepository extends JpaRepository<AppModuleEntity, Inte
@Query(value = "SELECT * FROM `modules` WHERE `id` IN (:checkModuleid) AND (`isactive`=1 AND `isdelete`=0) ORDER BY `id`", nativeQuery = true)
List<AppModuleEntity> showAllById(String[] checkModuleid);
@Query(value = "SELECT * FROM `modules` WHERE (`module_path` = :module_path) AND (`isactive`=1 AND `isdelete`=0) LIMIT 0,1", nativeQuery = true)
List<AppModuleEntity> findByModulePath(String module_path);
}

4
src/main/java/in/gov/chennaicorporation/gccoffice/repository/MenuItemAccessRepository.java

@ -13,6 +13,7 @@ import in.gov.chennaicorporation.gccoffice.entity.AppModuleAccessEntity;
import in.gov.chennaicorporation.gccoffice.entity.AppModuleEntity;
import in.gov.chennaicorporation.gccoffice.entity.MenuItemAccessEntity;
import in.gov.chennaicorporation.gccoffice.entity.MenuItemEntity;
import in.gov.chennaicorporation.gccoffice.entity.SubMenuItemAccessEntity;
@Repository
@Transactional
@ -22,4 +23,7 @@ public interface MenuItemAccessRepository extends JpaRepository<MenuItemAccessEn
@Query(value = "SELECT * FROM `menuitem_access` WHERE (`usergroup_id`=:usergroup_id AND `module_id`=:module_id) AND (`isactive`=1 AND `isdelete`=0)", nativeQuery = true)
List<MenuItemAccessEntity> findByUserGroupID(@Param("usergroup_id") String usergroup_id, @Param("module_id") String module_id);
@Query(value = "SELECT * FROM `menuitem_access` WHERE (`usergroup_id`=:usergroup_id AND `module_id`=:module_id AND `menuitem_id`=:menuitem_id) AND (`isactive`=1 AND `isdelete`=0) LIMIT 0,1", nativeQuery = true)
List<MenuItemAccessEntity> findByAll(@Param("usergroup_id") String usergroup_id,@Param("module_id") String module_id,@Param("menuitem_id") String menuitem_id);
}

5
src/main/java/in/gov/chennaicorporation/gccoffice/repository/MenuItemRepository.java

@ -10,6 +10,7 @@ import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import in.gov.chennaicorporation.gccoffice.entity.MenuItemEntity;
import in.gov.chennaicorporation.gccoffice.entity.SubMenuItemAccessEntity;
@Repository
@Transactional
@ -22,4 +23,8 @@ public interface MenuItemRepository extends JpaRepository<MenuItemEntity, Intege
@Query(value = "SELECT * FROM `menuitem` WHERE (`isactive`=1 AND `isdelete`=0) AND (`module_id`=:module_id AND `id` IN (:checkMenuid))", nativeQuery = true)
List<MenuItemEntity> getMenuItemByModuleIdAccess(@Param("module_id") int module_id, String[] checkMenuid);
@Query(value = "SELECT * FROM `menuitem` WHERE (`isactive`=1 AND `isdelete`=0) AND (`url`=:url) LIMIT 0,1", nativeQuery = true)
List<MenuItemEntity> findByUrl(@Param("url") String url);
}

6
src/main/java/in/gov/chennaicorporation/gccoffice/repository/SubMenuItemAccessRepository.java

@ -20,9 +20,13 @@ public interface SubMenuItemAccessRepository extends JpaRepository<SubMenuItemAc
@Query(value = "SELECT LAST_INSERT_ID()", nativeQuery = true)
Integer getLastInsertedId();
@Query(value = "SELECT * FROM `menuitem_access` WHERE `usergroup_id`=:usergroup_id AND `isactive`=1 AND `isdelete`=0", nativeQuery = true)
@Query(value = "SELECT * FROM `submenuitem_access` WHERE `usergroup_id`=:usergroup_id AND `isactive`=1 AND `isdelete`=0", nativeQuery = true)
List<SubMenuItemAccessEntity> findByUserGroupID(@Param("usergroup_id") String usergroup_id);
@Query(value = "SELECT * FROM `submenuitem_access` WHERE (`usergroup_id`=:usergroup_id AND `module_id`=:module_id AND `menuitem_id`=:menuitem_id) AND (`isactive`=1 AND `isdelete`=0)", nativeQuery = true)
List<SubMenuItemAccessEntity> findByUserGroupIDAccess(@Param("usergroup_id") String usergroup_id,@Param("module_id") String module_id,@Param("menuitem_id") String menuitem_id);
@Query(value = "SELECT * FROM `submenuitem_access` WHERE (`usergroup_id`=:usergroup_id AND `module_id`=:module_id AND `menuitem_id`=:menuitem_id AND `submenuitem_id`=:submenuitem_id) AND (`isactive`=1 AND `isdelete`=0) LIMIT 0,1", nativeQuery = true)
List<SubMenuItemAccessEntity> findByAll(@Param("usergroup_id") String usergroup_id,@Param("module_id") String module_id,@Param("menuitem_id") String menuitem_id,@Param("submenuitem_id") String submenuitem_id);
}

4
src/main/java/in/gov/chennaicorporation/gccoffice/repository/SubMenuItemRepository.java

@ -9,6 +9,7 @@ import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import in.gov.chennaicorporation.gccoffice.entity.MenuItemEntity;
import in.gov.chennaicorporation.gccoffice.entity.SubMenuItemEntity;
@Repository
@ -26,4 +27,7 @@ public interface SubMenuItemRepository extends JpaRepository<SubMenuItemEntity,
@Query(value = "SELECT * FROM `submenuitem` WHERE (`isactive`=1 AND `isdelete`=0) AND (`menuitem_id`=:menuitem_id AND `id` IN (:checkSubMenuid))", nativeQuery = true)
List<SubMenuItemEntity> getSubMenuItemByMenuItemIdAccess(@Param("menuitem_id") int menuitem_id,String[] checkSubMenuid);
@Query(value = "SELECT * FROM `submenuitem` WHERE (`url`=:url) AND (`isactive`=1 AND `isdelete`=0) LIMIT 0,1", nativeQuery = true)
List<SubMenuItemEntity> findByUrl(@Param("url") String url);
}

4
src/main/resources/application.properties

@ -30,7 +30,7 @@ file.upload.directory=${user.dir}/gccoffice_uploads
server.address=0.0.0.0
server.servlet.session.timeout: 30m
server.servlet.session.timeout: 5m
server.servlet.session.cookie.name: MYSESSIONID
server.servlet.session.cookie.max-age: 1800s
server.servlet.session.cookie.max-age: 10m

BIN
src/main/resources/static/assets/.DS_Store

BIN
src/main/resources/static/assets/images/403.png

After

Width: 1000  |  Height: 1080  |  Size: 106 KiB

57
src/main/resources/templates/error-403.html

@ -0,0 +1,57 @@
<!DOCTYPE html>
<html lang="en" dir="">
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="~{fragments/modules/base/head :: head}"></head>
<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="auth-wrapper">
<div class="container-fluid h-100">
<div class="row flex-row h-100 bg-white">
<div class="col-xl-6 col-lg-6 col-md-5 p-0 d-md-block d-lg-block d-sm-none d-none">
<div class="lavalite-bg authentication-form mx-auto text-center">
<div class="logo-centered" style="padding-top: 30px;"></div>
<img src="/assets/images/403.png" width="90%"/>
</div>
</div>
<div class="col-xl-6 col-lg-6 col-md-7 my-auto p-0">
<div class="authentication-form mx-auto text-center">
<div class="logo-centered">
<a href="/"><img src="/assets/images/logo.png" alt="Greater Chennai Corporation" class="header-brand-img" width="100%"></a>
</div>
<h3>Greater Chennai Corporation</h3>
<!-- Content -->
<div class="flex-grow-1 d-flex align-items-center p-5 bg-body-light">
<div class="w-100">
<p class="text-danger fs-4 fw-bold text-uppercase mb-2" th:utext="${errorStatus}">
403 Error
</p>
<h1 class="fw-bold mb-2" th:utext="${errorError}">
403 - Access Denied
</h1>
<p class="fs-4 fw-medium text-muted mb-5" th:utext="${errorMessage}">
Oops, You don`t have permission to access this page.
</p>
<a class="btn btn-lg btn-alt-danger" href="#" onclick="goBack()">
<i class="fa fa-arrow-left opacity-50 me-1"></i> Back
</a>
</div>
</div>
<!-- END Content -->
</div>
</div>
</div>
</div>
</div>
<script th:replace="~{fragments/modules/base/script :: script}"></script>
<script>
function goBack() {
history.go(-1); // This will go back one step in the browser's history
return false; // Prevent the default link behavior
}
</script>
</body>
</html>

4
src/main/resources/templates/fragments/modules/mtm/event_search_form.html

@ -2,7 +2,7 @@
<div class="col-12 mb-2">
<div class="input-group mb-0">
<span class="input-group-prepend">
<button type="button" class="btn btn-success" onclick="callReSetEventId(0);" title="Reset">
<button type="button" class="btn btn-success" onclick="callReSetEventId(0);" data-toggle="tooltip" data-animation="true" data-placement="top" data-original-title="Reset" title="Reset">
<i class="ik ik-refresh-ccw"></i>
</button>
</span>
@ -13,7 +13,7 @@
th:selected="${session.eventid == #strings.toString(mtmEvents.mtmId)}"></option>
</select>
<span class="input-group-append">
<button type="button" class="btn btn-success" onclick="callSetEventId();" title="Search">
<button type="button" class="btn btn-success" onclick="callSetEventId();" data-toggle="tooltip" data-animation="true" data-placement="top" data-original-title="Search" title="Search">
<i class="ik ik-search me-1"></i> Search
</button>
</span>

38
src/main/resources/templates/index.html

@ -87,42 +87,6 @@
<div th:replace="~{fragments/modules/base/app_module_menu_box :: div}"></div>
<script th:replace="~{fragments/modules/base/script :: script}"></script>
<script>
$(document).ready(function() {
$('#example').DataTable( {
dom: 'Bfrtip',
lengthMenu: [
[ 50, 100, 200, 500, -1 ],
[ '50 rows', '100 rows', '200 rows','500 rows', 'Show all' ]
],
buttons: [
{extend:'pageLength',className: 'btn btn-secondary'},
{extend:'copyHtml5',className: 'btn btn-secondary'},
{extend:'excelHtml5',className: 'btn btn-secondary'},
{extend:'csvHtml5',className: 'btn btn-secondary'},
{extend:'pdfHtml5',className: 'btn btn-secondary'},
],
responsive: true,
searching: false,
select: false,
processing: true,
serverSide: true,
serverMethod: 'post',
ajax: {
url:'/api/list2?draw=1&start=10&length=10'
},
columns: [
{ data: 'name' },
{ data: 'pos' },
{ data: 'off' },
{ data: 'age' },
{ data: 'date' },
{ data: 'salary' },
]
} );
} );
</script>
</body>
</html>

2
src/main/resources/templates/modules/mtm/mayor/by-event-list.html

@ -92,7 +92,7 @@
<th class="text-center" colspan=4>Petitions</th>
<th class="text-center" colspan=3>Compliants</th>
</tr>
<tr class="table-bordered">
<tr>
<th class="text-center no-sort">S.No</th>
<th class="">Name</th>
<th class="">Date</th>

186
src/main/resources/templates/modules/mtm/mayor/by-officer-list.html

@ -0,0 +1,186 @@
<!DOCTYPE html>
<html lang="en" dir="">
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="~{fragments/modules/base/head :: head}"></head>
<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">
<div class="row align-items-end">
<div class="col-lg-6">
<div class="page-header-title">
<i class="fas fa-th-large bg-blue"></i>
<div class="d-inline">
<h5>Officer`s report based on complaint`s</h5>
<span>Makkalai Thedi Mayoral Module</span>
</div>
</div>
</div>
<div class="col-lg-6">
<nav class="breadcrumb-container" aria-label="breadcrumb">
<ol class="breadcrumb">
<li class="breadcrumb-item">
<a href="/index"><i class="ik ik-home"></i></a>
</li>
<li class="breadcrumb-item">Makkalai Thedi Mayoral </li>
<li class="breadcrumb-item">Mayor</li>
<li class="breadcrumb-item active" aria-current="page">Petition List</li>
</ol>
</nav>
</div>
</div>
</div>
<hr>
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-block">
<div th:replace="~{fragments/modules/mtm/event_search_form :: div}"></div>
<div>
<table id="assetDatatable" class="table table-striped table-bordered table-hover dataTable" role="grid" width="100%">
<thead class="thead-dark">
<tr class="table-bordered">
<th class="text-center no-sort">S.No</th>
<th class="">Officer`s</th>
<th class="">Off&nbsp;ID</th>
<th class="">Event</th>
<th class="text-center">Total</th>
<th class="text-center">Completed</th>
<th class="text-center">Pending</th>
</tr>
</theadclass="thead-dark">
<tbody>
<tr th:each="officers, i : ${officerTableList}" class="${officerTableList}">
<td th:text="${i.index + 1}">0</td>
<td th:text="${officers.officerName}"></td>
<td th:text="${officers.offID}"></td>
<td th:text="${officers.eventName}"></td>
<td th:text="${officers.officerPetitionCount}"></td>
<td th:text="${officers.officerCompletedCount}"></td>
<td th:text="${officers.officerPendingCount}"></td>
</tr>
</tbody>
<tfoot class="thead-dark">
<tr>
<th class="text-center no-sort">S.No</th>
<th class="">Officer`s</th>
<th class="">Event</th>
<th class="">Off ID</th>
<th class="text-center">Total</th>
<th class="text-center">Completed</th>
<th class="text-center">Pending</th>
</tr>
</tfoot>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<footer th:replace="~{fragments/modules/base/footer :: footer}"></footer>
</div>
</div>
<div th:replace="~{fragments/modules/mtm/modal-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 th:replace="~{fragments/modules/mtm/script :: script}"></script>
<script th:inline="javascript">
//var qrAssetFeedbackApiUrl = "[[${qrAssetFeedbackApiUrl}]]";
$(document).ready(function() {
// DataTables buttons configuration
var buttons = [
{
extend: 'pageLength',
className: 'btn btn-warning'
},
{
title: 'Data export',
extend: 'copyHtml5',
text: 'Copy',
className: 'btn btn-secondary',
id: 'copyBtn',
exportOptions: {
columns: ':not(.export-hidden)', // Exclude columns with class 'export-hidden'
},
},
{
extend: 'excelHtml5',
text: 'Excel',
className: 'btn btn-secondary',
id: 'excelBtn',
title: 'Complaint List',
exportOptions: {
columns: ':not(.export-hidden)', // Exclude columns with class 'export-hidden'
},
},
{
extend: 'csvHtml5',
text: 'CSV',
className: 'btn btn-secondary',
id: 'csvBtn',
title: 'Complaint List',
exportOptions: {
columns: ':not(.export-hidden)', // Exclude columns with class 'export-hidden'
},
},
{
extend: 'pdfHtml5',
text: 'PDF',
className: 'btn btn-secondary',
id: 'pdfBtn',
title: 'Complaint List',
exportOptions: {
columns: ':not(.export-hidden)', // Exclude columns with class 'export-hidden'
},
}
];
$('#assetDatatable').DataTable( {
dom: 'Bftip',
columnDefs: [
{ targets: 'no-sort', orderable: false }
],
lengthMenu: [
[ 50, 100, 200, 500, -1 ],
[ '50 rows', '100 rows', '200 rows','500 rows', 'Show all' ]
],
scrollY: '50vh',
fixedColumns: {
left: 1,
right: 1
},
buttons: [buttons],
responsive: true,
searching: false,
select: false,
processing: false,
} );
} );
</script>
</body>
</html>
Loading…
Cancel
Save