diff --git a/src/main/java/app/snapshot/qure/config/SecurityConfig.java b/src/main/java/app/snapshot/qure/config/SecurityConfig.java index c933154..a42c769 100644 --- a/src/main/java/app/snapshot/qure/config/SecurityConfig.java +++ b/src/main/java/app/snapshot/qure/config/SecurityConfig.java @@ -44,7 +44,6 @@ public SecurityConfig(KakaoOAuth2UserService kakaoOAuth2UserService, this.kakaoOAuth2UserService = kakaoOAuth2UserService; this.managerService = managerService; } - @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http @@ -84,17 +83,12 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { (Map) principal.getAttributes().get("kakao_account"); Map profile = (Map) kakaoAccount.get("profile"); - String email = (String) kakaoAccount.get("email"); String nickname = (String) profile.get("nickname"); - ManagerDTO manager = managerService.processLogin(email, nickname); - HttpSession session = request.getSession(); SessionUtil.setManagerSession(session, manager.getManagersId(), email, nickname); - System.out.println("로그인 성공: " + nickname + " (" + email + ")"); - response.sendRedirect(request.getContextPath() + "/dashboard"); }) .userInfoEndpoint(userInfo -> userInfo.userService(kakaoOAuth2UserService)) @@ -102,7 +96,6 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { return http.build(); } - @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); diff --git a/src/main/java/app/snapshot/qure/facilities/dto/FacilityRegisterDTO.java b/src/main/java/app/snapshot/qure/facilities/dto/FacilityRegisterDTO.java deleted file mode 100644 index 5cbf4ce..0000000 --- a/src/main/java/app/snapshot/qure/facilities/dto/FacilityRegisterDTO.java +++ /dev/null @@ -1,10 +0,0 @@ -package app.snapshot.qure.facilities.dto; - -import lombok.Data; - -@Data -public class FacilityRegisterDTO { - private String domain; // 소속 - private String equipment; // 설비명 - private int inspectorId; // FK -} diff --git a/src/main/java/app/snapshot/qure/facilities/repository/FacilitiesRegisterMapper.java b/src/main/java/app/snapshot/qure/facilities/repository/FacilitiesRegisterMapper.java deleted file mode 100644 index 32bfd4f..0000000 --- a/src/main/java/app/snapshot/qure/facilities/repository/FacilitiesRegisterMapper.java +++ /dev/null @@ -1,9 +0,0 @@ -package app.snapshot.qure.facilities.repository; - -import app.snapshot.qure.facilities.dto.FacilityRegisterDTO; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface FacilitiesRegisterMapper { - void insertFacility(FacilityRegisterDTO dto); -} diff --git a/src/main/java/app/snapshot/qure/inspectors/controller/InspectorDetailController.java b/src/main/java/app/snapshot/qure/inspectors/controller/InspectorDetailController.java index 4f65309..4aa6456 100644 --- a/src/main/java/app/snapshot/qure/inspectors/controller/InspectorDetailController.java +++ b/src/main/java/app/snapshot/qure/inspectors/controller/InspectorDetailController.java @@ -24,8 +24,9 @@ public String inspectorDetail(@PathVariable("id") int id, Model model) { List details = inspectorDetailService.getInspectorDetail(id); if (!details.isEmpty()) { - model.addAttribute("inspector", details.get(0)); // 이름/연락처 - model.addAttribute("facilities", details); // 시설 리스트 + model.addAttribute("inspectorName", details.get(0).getInspectorName()); + model.addAttribute("phone", details.get(0).getPhone()); + model.addAttribute("facilities", details); } return "inspectors/inspectorDetail"; diff --git a/src/main/java/app/snapshot/qure/inspectors/controller/InspectorRegisterController.java b/src/main/java/app/snapshot/qure/inspectors/controller/InspectorRegisterController.java index 3bf864a..f11e89b 100644 --- a/src/main/java/app/snapshot/qure/inspectors/controller/InspectorRegisterController.java +++ b/src/main/java/app/snapshot/qure/inspectors/controller/InspectorRegisterController.java @@ -1,12 +1,13 @@ package app.snapshot.qure.inspectors.controller; import app.snapshot.qure.inspectors.dto.InspectorRegisterDTO; -import app.snapshot.qure.facilities.dto.FacilityRegisterDTO; import app.snapshot.qure.inspectors.service.InspectorRegisterService; +import app.snapshot.qure.login.util.SessionUtil; +import jakarta.servlet.http.HttpSession; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; @Controller @RequiredArgsConstructor @@ -15,11 +16,18 @@ public class InspectorRegisterController { private final InspectorRegisterService inspectorRegisterService; @PostMapping("/inspectors/register") - public String registerInspectorWithFacility( + public String registerInspector( @ModelAttribute InspectorRegisterDTO inspectorDto, - @ModelAttribute FacilityRegisterDTO facilityDto) { + HttpSession session) { + + Long managerId = SessionUtil.getManagerId(session); + if (managerId == null) { + return "redirect:/dashboard"; // 로그인 안된 경우 + } + + inspectorDto.setManagerId(managerId); - inspectorRegisterService.registerInspectorWithFacility(inspectorDto, facilityDto); + inspectorRegisterService.registerInspector(inspectorDto); return "redirect:/inspectors/inspectorsList"; } } diff --git a/src/main/java/app/snapshot/qure/inspectors/controller/InspectorsController.java b/src/main/java/app/snapshot/qure/inspectors/controller/InspectorsController.java index a8df35d..3c238b9 100644 --- a/src/main/java/app/snapshot/qure/inspectors/controller/InspectorsController.java +++ b/src/main/java/app/snapshot/qure/inspectors/controller/InspectorsController.java @@ -1,6 +1,8 @@ package app.snapshot.qure.inspectors.controller; import app.snapshot.qure.inspectors.dto.InspectorDTO; import app.snapshot.qure.inspectors.service.InspectorsService; +import app.snapshot.qure.login.util.SessionUtil; +import jakarta.servlet.http.HttpSession; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @@ -19,17 +21,33 @@ public InspectorsController(InspectorsService inspectorsService) { @GetMapping("/inspectors/inspectorsList") public String showInspectorList(@RequestParam(defaultValue = "1") int page, - Model model - ) { - int size = 15; - List inspectors = inspectorsService.getPagedInspectors(page, size); - int totalCount = inspectorsService.getTotalCount(); + Model model, HttpSession session) { + int size = 15; // 한 페이지 데이터 수 + Long managersId = SessionUtil.getManagerId(session); + System.out.println("세션 managersId: " + managersId); + if (managersId == null) { + return "redirect:/dashboard"; + } + + List inspectors = inspectorsService.getPagedInspectors(page, size,managersId); + int totalCount = inspectorsService.getTotalCount(Math.toIntExact(managersId)); int totalPages = (int) Math.ceil((double) totalCount / size); + int pageBlock = 3; + int currentBlock = (int) Math.ceil((double) page / pageBlock); + + int startPage = (currentBlock - 1) * pageBlock + 1; + int endPage = startPage + pageBlock - 1; + if (endPage > totalPages) { + endPage = totalPages; + } model.addAttribute("inspectors", inspectors); model.addAttribute("currentPage", page); model.addAttribute("totalPages", totalPages); model.addAttribute("totalCount", totalCount); + model.addAttribute("startPage", startPage); + model.addAttribute("endPage", endPage); + return "inspectors/inspectorsList"; } } \ No newline at end of file diff --git a/src/main/java/app/snapshot/qure/inspectors/dto/InspectorDTO.java b/src/main/java/app/snapshot/qure/inspectors/dto/InspectorDTO.java index 7cd554f..d53bad7 100644 --- a/src/main/java/app/snapshot/qure/inspectors/dto/InspectorDTO.java +++ b/src/main/java/app/snapshot/qure/inspectors/dto/InspectorDTO.java @@ -11,4 +11,5 @@ public class InspectorDTO { private int inspectorId; private String phone; private String name; + private Long managerId; } diff --git a/src/main/java/app/snapshot/qure/inspectors/dto/InspectorDetailDTO.java b/src/main/java/app/snapshot/qure/inspectors/dto/InspectorDetailDTO.java index 38edee6..6cc4c41 100644 --- a/src/main/java/app/snapshot/qure/inspectors/dto/InspectorDetailDTO.java +++ b/src/main/java/app/snapshot/qure/inspectors/dto/InspectorDetailDTO.java @@ -5,8 +5,9 @@ @Data public class InspectorDetailDTO { private int inspectorId; - private String name; + private String inspectorName; // ip.name → inspectorName private String phone; private String domain; - private String facility; + private String facility; // f.name → facility } + diff --git a/src/main/java/app/snapshot/qure/inspectors/dto/InspectorRegisterDTO.java b/src/main/java/app/snapshot/qure/inspectors/dto/InspectorRegisterDTO.java index 33942b4..6cc1f49 100644 --- a/src/main/java/app/snapshot/qure/inspectors/dto/InspectorRegisterDTO.java +++ b/src/main/java/app/snapshot/qure/inspectors/dto/InspectorRegisterDTO.java @@ -7,4 +7,5 @@ public class InspectorRegisterDTO { private Integer inspectorId; private String name; private String phone; + private Long managerId; } diff --git a/src/main/java/app/snapshot/qure/inspectors/repository/InspectorsMapper.java b/src/main/java/app/snapshot/qure/inspectors/repository/InspectorsMapper.java index c9c870c..b9d48ca 100644 --- a/src/main/java/app/snapshot/qure/inspectors/repository/InspectorsMapper.java +++ b/src/main/java/app/snapshot/qure/inspectors/repository/InspectorsMapper.java @@ -2,13 +2,15 @@ import app.snapshot.qure.inspectors.dto.InspectorDTO; import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; -import org.springframework.security.core.parameters.P; import java.util.List; +import java.util.Map; @Mapper public interface InspectorsMapper { - List findPaged(@Param("startRow") int startRow, @Param("endRow") int endRow); - int countAll(); + // 특정 매니저의 작업자 목록 페이징 조회 + List findPagedByManager(Map params); + + // 특정 매니저의 작업자 총 수 카운트 + int countByManager(long managersId); } diff --git a/src/main/java/app/snapshot/qure/inspectors/repository/InspectorsRegisterMapper.java b/src/main/java/app/snapshot/qure/inspectors/repository/InspectorsRegisterMapper.java index bd3c0d8..9ed5e94 100644 --- a/src/main/java/app/snapshot/qure/inspectors/repository/InspectorsRegisterMapper.java +++ b/src/main/java/app/snapshot/qure/inspectors/repository/InspectorsRegisterMapper.java @@ -2,12 +2,12 @@ import app.snapshot.qure.inspectors.dto.InspectorRegisterDTO; import org.apache.ibatis.annotations.Mapper; - import org.apache.ibatis.annotations.Param; @Mapper public interface InspectorsRegisterMapper { void insertInspector(InspectorRegisterDTO dto); + int getLastInsertedId(); // 시퀀스 currval 가져오기용 Integer findInspectorIdByNameAndPhone( diff --git a/src/main/java/app/snapshot/qure/inspectors/service/InspectorRegisterService.java b/src/main/java/app/snapshot/qure/inspectors/service/InspectorRegisterService.java index 712551f..4fb1054 100644 --- a/src/main/java/app/snapshot/qure/inspectors/service/InspectorRegisterService.java +++ b/src/main/java/app/snapshot/qure/inspectors/service/InspectorRegisterService.java @@ -1,9 +1,7 @@ package app.snapshot.qure.inspectors.service; import app.snapshot.qure.inspectors.dto.InspectorRegisterDTO; -import app.snapshot.qure.facilities.dto.FacilityRegisterDTO; import app.snapshot.qure.inspectors.repository.InspectorsRegisterMapper; -import app.snapshot.qure.facilities.repository.FacilitiesRegisterMapper; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -13,24 +11,25 @@ public class InspectorRegisterService { private final InspectorsRegisterMapper inspectorsRegisterMapper; - private final FacilitiesRegisterMapper facilitiesRegisterMapper; + /** + * 점검자 등록 + * - 이름, 전화번호로 중복 체크 + * - 없으면 새로 등록, 있으면 무시 + */ @Transactional - public void registerInspectorWithFacility(InspectorRegisterDTO inspectorDto, FacilityRegisterDTO facilityDto) { - // 1. 이미 존재하는 작업자인지 확인 - Integer existingId = inspectorsRegisterMapper.findInspectorIdByNameAndPhone(inspectorDto.getName(), inspectorDto.getPhone()); + public void registerInspector(InspectorRegisterDTO inspectorDto) { + // 이미 존재하는 작업자인지 확인 + Integer existingId = inspectorsRegisterMapper + .findInspectorIdByNameAndPhone(inspectorDto.getName(), inspectorDto.getPhone()); - int inspectorId; if (existingId != null) { - inspectorId = existingId; // 기존 inspector 재사용 - } else { - inspectorsRegisterMapper.insertInspector(inspectorDto); - inspectorId = inspectorsRegisterMapper.getLastInsertedId(); + System.out.println("이미 존재하는 점검자 → id=" + existingId); + return; } - // 2. 설비 등록 - facilityDto.setInspectorId(inspectorId); - facilitiesRegisterMapper.insertFacility(facilityDto); + inspectorsRegisterMapper.insertInspector(inspectorDto); + int newId = inspectorsRegisterMapper.getLastInsertedId(); + System.out.println("새 점검자 등록 완료 → id=" + newId); } - } diff --git a/src/main/java/app/snapshot/qure/inspectors/service/InspectorsService.java b/src/main/java/app/snapshot/qure/inspectors/service/InspectorsService.java index b2ebfae..0b51456 100644 --- a/src/main/java/app/snapshot/qure/inspectors/service/InspectorsService.java +++ b/src/main/java/app/snapshot/qure/inspectors/service/InspectorsService.java @@ -4,7 +4,9 @@ import app.snapshot.qure.inspectors.repository.InspectorsMapper; import org.springframework.stereotype.Service; +import java.util.HashMap; import java.util.List; +import java.util.Map; @Service public class InspectorsService { @@ -15,13 +17,21 @@ public InspectorsService(InspectorsMapper inspectorMapper) { this.inspectorsMapper = inspectorMapper; } - public List getPagedInspectors(int page, int size) { - int startRow = (page-1) * size+1; + public List getPagedInspectors(int page, int size, long managersId) { + int startRow = (page - 1) * size + 1; int endRow = page * size; - return inspectorsMapper.findPaged(startRow, endRow); + + Map params = new HashMap<>(); + params.put("startRow", startRow); + params.put("endRow", endRow); + params.put("managersId", managersId); + + return inspectorsMapper.findPagedByManager(params); } - public int getTotalCount() { - return inspectorsMapper.countAll(); - }; + public int getTotalCount(int managersId) { + return inspectorsMapper.countByManager(managersId); + } + + } diff --git a/src/main/java/app/snapshot/qure/login/handler/OAuth2AuthenticationSuccessHandler.java b/src/main/java/app/snapshot/qure/login/handler/OAuth2AuthenticationSuccessHandler.java index b90a8d2..197ad2e 100644 --- a/src/main/java/app/snapshot/qure/login/handler/OAuth2AuthenticationSuccessHandler.java +++ b/src/main/java/app/snapshot/qure/login/handler/OAuth2AuthenticationSuccessHandler.java @@ -42,6 +42,8 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo // 세션에 카카오 로그인 정보 저장 (유틸리티 사용) HttpSession session = request.getSession(true); // 세션이 없으면 생성 SessionUtil.setManagerSession(session, manager.getManagersId(), email, name); + System.out.println("세션 저장 완료: managerId=" + manager.getManagersId() + + ", sessionId=" + session.getId()); // 세션 설정 추가 session.setMaxInactiveInterval(60 * 60 * 24); // 24시간 @@ -51,6 +53,6 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo ", sessionId=" + session.getId()); // 홈 페이지로 리다이렉트 - response.sendRedirect("/manager/home"); + response.sendRedirect("/dashboard"); } } \ No newline at end of file diff --git a/src/main/java/app/snapshot/qure/login/util/SessionUtil.java b/src/main/java/app/snapshot/qure/login/util/SessionUtil.java index 4330e6d..ddd918f 100644 --- a/src/main/java/app/snapshot/qure/login/util/SessionUtil.java +++ b/src/main/java/app/snapshot/qure/login/util/SessionUtil.java @@ -9,8 +9,8 @@ public class SessionUtil { public static final String KAKAO_NAME = "KAKAO_NAME"; // 세션에 매니저 정보 저장 - public static void setManagerSession(HttpSession session, Long managerId, String email, String name) { - session.setAttribute(LOGIN_MANAGER_ID, managerId); + public static void setManagerSession(HttpSession session, Long managersId, String email, String name) { + session.setAttribute(LOGIN_MANAGER_ID, managersId); session.setAttribute(KAKAO_EMAIL, email); session.setAttribute(KAKAO_NAME, name); } diff --git a/src/main/resources/mappers/FacilitiesRegisterMapper.xml b/src/main/resources/mappers/FacilitiesRegisterMapper.xml deleted file mode 100644 index 691c13f..0000000 --- a/src/main/resources/mappers/FacilitiesRegisterMapper.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - INSERT INTO facilities (facility_id, domain, name, inspector_id) - VALUES (facility_seq.NEXTVAL, #{domain}, #{equipment}, #{inspectorId}) - - - diff --git a/src/main/resources/mappers/InsepctorRegisterMapper.xml b/src/main/resources/mappers/InsepctorRegisterMapper.xml index 7fbb947..21390dd 100644 --- a/src/main/resources/mappers/InsepctorRegisterMapper.xml +++ b/src/main/resources/mappers/InsepctorRegisterMapper.xml @@ -6,8 +6,8 @@ - INSERT INTO inspector_profile (inspector_id, name, phone) - VALUES (inspector_seq.NEXTVAL, #{name}, #{phone}) + INSERT INTO inspector_profile (inspector_id, name, phone, manager_id) + VALUES (inspector_seq.NEXTVAL, #{name}, #{phone}, #{managerId}) - SELECT ip.inspector_id, - ip.name AS name, -- DTO의 name 필드랑 맞춤 - ip.phone, - f.domain, - f.name AS facility + SELECT + ip.inspector_id AS inspectorId, + ip.name AS inspectorName, + ip.phone AS phone, + f.domain AS domain, + f.name AS facility FROM inspector_profile ip - JOIN facilities f ON ip.inspector_id = f.inspector_id + LEFT JOIN facilities f + ON ip.inspector_id = f.inspector_id WHERE ip.inspector_id = #{inspectorId} diff --git a/src/main/resources/mappers/InspectorsMapper.xml b/src/main/resources/mappers/InspectorsMapper.xml index cac5cc2..0f22ebb 100644 --- a/src/main/resources/mappers/InspectorsMapper.xml +++ b/src/main/resources/mappers/InspectorsMapper.xml @@ -5,20 +5,29 @@ - + SELECT inspector_id AS inspectorId, + phone, + name, + manager_id AS managerId FROM ( - SELECT ROW_NUMBER() OVER (ORDER BY inspector_id) AS rn, - inspector_id, - name, - phone + SELECT ROW_NUMBER() OVER (ORDER BY inspector_id DESC) AS rn, + inspector_id, + phone, + name, + manager_id FROM inspector_profile + WHERE manager_id = #{managersId} ) WHERE rn BETWEEN #{startRow} AND #{endRow} - + SELECT COUNT(*) + FROM inspector_profile + WHERE manager_id = #{managersId} diff --git a/src/main/webapp/WEB-INF/assets/css/inspectorsList.css b/src/main/webapp/WEB-INF/assets/css/inspectorsList.css index 1b05b21..1a7f62a 100644 --- a/src/main/webapp/WEB-INF/assets/css/inspectorsList.css +++ b/src/main/webapp/WEB-INF/assets/css/inspectorsList.css @@ -54,7 +54,7 @@ body{ display:flex;justify-content:space-between;align-items:center; background:#ffffff; border-radius:30px; - padding:12px 16px; + padding:12px 16x; } .subTitle{ color:#5a4a21; @@ -86,8 +86,15 @@ button:hover{background:#fafafa} /* “전체 n명” 라벨 */ .totalTitle{color:#474D56;font-size:16px;font-weight:700;margin-right:6px} -.highlight{color:#5a4a21;background:#fff8d1;border:1px solid #eacb6a; - padding:2px 8px;border-radius:999px;font-weight:800} +.highlight{ + color:#5a4a21; + background:#fff8d1; + border:1px solid #eacb6a; + padding:2px 8px; + border-radius:999px; + font-weight:800; + +} /* ===== 표: 행마다 보더 박스 ===== */ .inspectorTable{ @@ -97,6 +104,7 @@ button:hover{background:#fafafa} background: transparent; table-layout: fixed; font-size: 15px; + margin-top: 16px; } /* 헤더 */ @@ -152,9 +160,11 @@ input[type="checkbox"]:checked::after{ a{color:inherit;text-decoration:none} /* ===== 페이지네이션: facilities 원형 버튼 스타일 ===== */ -.pagination{ - display:flex;justify-content:center;align-items:center;gap:12px; - margin-top:8px; +.pagination { + display: flex; + justify-content: center; + gap: 8px; + margin-top: 16px; } .circle-btn{ @@ -169,17 +179,65 @@ a{color:inherit;text-decoration:none} } .circle-btn.disabled{pointer-events:none;opacity:.45} +.page-btn { + display: flex; + justify-content: center; + align-items: center; + width: 36px; + height: 36px; + border: 1px solid #f2c65b; + border-radius: 6px; + font-size: 15px; + font-weight: 600; + color: #3c3c3c; + text-decoration: none; + background: #fff; + cursor: pointer; + color: #5A4A21; +} + +.page-btn:hover { + background: #fff9e6; +} + +.page-btn.active { + background: #FFE59A; + font-weight: 800; +} + +.page-btn.disabled { + pointer-events: none; + opacity: 0.4; +} + /* ===== 모달: facilities 카드 톤 매칭 ===== */ .modal{ display:none;position:fixed;z-index:1000;left:0;top:0;width:100%;height:100%; background:rgba(0,0,0,.4);justify-content:center;align-items:center; } .modal-content{ - background:#fff;padding:30px 32px;border-radius:20px;width:420px; - box-shadow:0 10px 24px rgba(0,0,0,.12);position:relative; + background:#fff; + padding:30px; + border-radius:20px; + width:420px; + box-shadow:0 10px 24px rgba(0,0,0,.12); + position:relative; + font-size: 16px !important; } .modal-content h2{ - text-align:center;margin:0 0 20px 0;color:#3c3c3c;font-weight:800 + text-align:center; + margin:0 0 20px 0; + color:#3c3c3c; + font-weight:600 +} + +#inspectorModal .modal-content h2 { + font-size: 20px; /* 원하는 크기 */ + font-weight: 800; + text-align: center; + margin: 0 0 20px 0; + color: #3c3c3c; + line-height: 1.4; } /* 경고 모달 */ @@ -191,29 +249,81 @@ a{color:inherit;text-decoration:none} .delete-modal p{margin:0 0 18px 0;color:#474D56;font-size:14px} /* 폼 컴포넌트 */ -.form-group{display:flex;flex-direction:column;gap:8px;margin-bottom:16px} -.form-group label{font-weight:700;color:#3c3c3c} -.form-group input,.form-group select{ - padding:10px;border:1px solid var(--line);border-radius:10px;font-size:14px;outline:none;background:#fff +.form-group{ + display:flex; + flex-direction:column; + gap:8px; + margin-bottom:16px +} +.form-group label{ + font-weight:700; + color:#3c3c3c +} +.form-group input { + padding:10px; + border:1px solid var(--line); + border-radius:10px; + line-height: 1.5; + font-size:14px; + height: 42px; + outline:none; + background:#fff + appearance: none; + width: 100%; } .form-group input:focus,.form-group select:focus{border-color:#eacb6a} -.phone-input{display:flex;gap:8px;align-items:center} -.phone-input input{ - border:1px solid var(--line);border-radius:8px;text-align:center;font-size:14px;padding:8px 10px +.phone-input { + display: flex; + gap: 8px; + align-items: center; + width: 100%; + box-sizing: border-box; +} + +/* 첫 번째 칸(3자리: 010) → 짧게 */ +.phone-input input:nth-of-type(1) { + flex: 1; + max-width: 80px; } -.phone-input input:first-of-type{width:80px} -.phone-input input:not(:first-of-type){width:110px} -.phone-input span{color:#FFBF58;font-weight:800} +/* 두 번째 칸(4자리) → 넓게 */ +.phone-input input:nth-of-type(2) { + flex: 2; +} + +/* 세 번째 칸(4자리) → 넓게 */ +.phone-input input:nth-of-type(3) { + flex: 2; +} + +/* 하이픈(-)은 고정 */ +.phone-input span { + flex: 0 0 auto; + color: #FFBF58; + font-weight: 800; +} /* 모달 버튼 그룹 */ .modal-buttons{ - display:flex;justify-content:center;align-items:center;gap:16px;margin-top:28px + display:flex; + justify-content:center; + align-items:center; + gap:16px; + margin-top:28px } .btn{ - width:150px;padding:10px 0;border-radius:20px;font-size:14px;font-weight:800; - cursor:pointer;border:1px solid var(--line);transition:all .2s ease; - display:flex;align-items:center;justify-content:center;background:#fff + width:100%; + padding:10px 0; + border-radius:20px; + font-size:14px; + font-weight:800; + cursor:pointer; + border:1px solid var(--line); + transition:all .2s ease; + display:flex; + align-items:center; + justify-content:center;background:#fff; + min-height: 42px; } .btn.cancel{background:#FFF2CC;color:#5a4a21;border-color:#f7d58a} .btn.cancel:hover{background:#FFE599} diff --git a/src/main/webapp/WEB-INF/assets/images/plus.svg b/src/main/webapp/WEB-INF/assets/images/plus.svg index edffae5..5e7774b 100644 --- a/src/main/webapp/WEB-INF/assets/images/plus.svg +++ b/src/main/webapp/WEB-INF/assets/images/plus.svg @@ -1,3 +1,3 @@ - - + + diff --git a/src/main/webapp/WEB-INF/assets/images/trash.svg b/src/main/webapp/WEB-INF/assets/images/trash.svg index 011a91e..a9e69f7 100644 --- a/src/main/webapp/WEB-INF/assets/images/trash.svg +++ b/src/main/webapp/WEB-INF/assets/images/trash.svg @@ -1,3 +1,5 @@ - - + + + + diff --git a/src/main/webapp/WEB-INF/assets/js/inspectorsList.js b/src/main/webapp/WEB-INF/assets/js/inspectorsList.js index 3ba232c..07240ec 100644 --- a/src/main/webapp/WEB-INF/assets/js/inspectorsList.js +++ b/src/main/webapp/WEB-INF/assets/js/inspectorsList.js @@ -1,4 +1,3 @@ -// inspectorsList.js function onlyNumber(el) { el.value = el.value.replace(/[^0-9]/g, ''); @@ -10,120 +9,82 @@ function onlyNumber(el) { (p1 && p2 && p3) ? `${p1}-${p2}-${p3}` : ""; } -const modal = document.getElementById("inspectorModal"); -const openModalBtn = document.querySelector(".register"); -const cancelBtn = document.querySelector(".btn.cancel"); -const form = modal ? modal.querySelector("form") : null; - -// 모달 열기 -if (openModalBtn) { - openModalBtn.addEventListener("click", (e) => { - e.preventDefault(); - modal.style.display = "flex"; - }); -} - -// 취소 버튼 눌렀을 때 닫기 + reset -if (cancelBtn) { - cancelBtn.addEventListener("click", (e) => { - e.preventDefault(); - if (form) form.reset(); - document.getElementById("phone").value = ""; // hidden 필드 초기화 - modal.style.display = "none"; - }); -} - -// 바깥 클릭 시 닫기 -if (modal) { - modal.addEventListener("click", (e) => { - if (e.target === modal) { +document.addEventListener("DOMContentLoaded", function () { + const modal = document.getElementById("inspectorModal"); + const openModalBtn = document.querySelector(".register"); + const cancelBtn = document.querySelector(".btn.cancel"); + const form = modal ? modal.querySelector("form") : null; + + if (openModalBtn) { + openModalBtn.addEventListener("click", (e) => { + e.preventDefault(); + modal.style.display = "flex"; + }); + } + + if (cancelBtn) { + cancelBtn.addEventListener("click", (e) => { + e.preventDefault(); if (form) form.reset(); document.getElementById("phone").value = ""; modal.style.display = "none"; - } - }); -} - -// 소속-설비 매핑 -const equipmentOptions = { - "소방": ["스프링쿨러", "소화기", "화재경보기"], - "순찰": ["CCTV", "비상벨", "출입통제"], - "청결": ["분리수거함", "화장실", "소독기"], -}; - -const domainSelect = document.getElementById("domain"); -const equipmentSelect = document.getElementById("equipment"); - -if (domainSelect && equipmentSelect) { - domainSelect.addEventListener("change", function () { - const selectDomain = this.value; - equipmentSelect.innerHTML = ""; - - if (selectDomain && equipmentOptions[selectDomain]) { - const defaultOption = document.createElement("option"); - defaultOption.value = ""; - defaultOption.textContent = "설비를 선택하세요"; - equipmentSelect.appendChild(defaultOption); - - equipmentOptions[selectDomain].forEach((equip) => { - const option = document.createElement("option"); - option.value = equip; - option.textContent = equip; - equipmentSelect.appendChild(option); - }); - } else { - const option = document.createElement("option"); - option.value = ""; - option.textContent = "소속을 먼저 선택하세요."; - equipmentSelect.appendChild(option); - } - }); -} - -// 제출 시 hidden phone 값 채우기 -if (form) { - form.addEventListener("submit", function () { - const p1 = document.getElementById("phone1").value; - const p2 = document.getElementById("phone2").value; - const p3 = document.getElementById("phone3").value; - - document.getElementById("phone").value = - (p1 && p2 && p3) ? `${p1}-${p2}-${p3}` : ""; - }); -} - -// 삭제 모달 -const deleteBtn = document.getElementById("deleteBtn"); -const deleteModal = document.getElementById("deleteModal"); -const deleteCancel = document.getElementById("deleteCancel"); -const selectedIdsInput = document.getElementById("selectedIdsInput"); - -if (deleteBtn) { - deleteBtn.addEventListener("click", () => { - const checkedBoxes = document.querySelectorAll("input[name='selectedIds']:checked"); - if (checkedBoxes.length === 0) { - alert("삭제할 작업자를 선택하세요."); - return; - } - - // 선택된 ID들을 hidden input에 담기 - const ids = Array.from(checkedBoxes).map(cb => cb.value); - selectedIdsInput.value = ids.join(","); - - deleteModal.style.display = "flex"; - }); -} - -if (deleteCancel) { - deleteCancel.addEventListener("click", () => { - deleteModal.style.display = "none"; - }); -} - -if (deleteModal) { - deleteModal.addEventListener("click", (e) => { - if (e.target === deleteModal) { + }); + } + + if (modal) { + modal.addEventListener("click", (e) => { + if (e.target === modal) { + if (form) form.reset(); + document.getElementById("phone").value = ""; + modal.style.display = "none"; + } + }); + } + + + if (form) { + form.addEventListener("submit", function () { + const p1 = document.getElementById("phone1").value; + const p2 = document.getElementById("phone2").value; + const p3 = document.getElementById("phone3").value; + + document.getElementById("phone").value = + (p1 && p2 && p3) ? `${p1}-${p2}-${p3}` : ""; + }); + } + + // 삭제 모달 + const deleteBtn = document.getElementById("deleteBtn"); + const deleteModal = document.getElementById("deleteModal"); + const deleteCancel = document.getElementById("deleteCancel"); + const selectedIdsInput = document.getElementById("selectedIdsInput"); + + if (deleteBtn) { + deleteBtn.addEventListener("click", () => { + const checkedBoxes = document.querySelectorAll("input[name='selectedIds']:checked"); + if (checkedBoxes.length === 0) { + alert("삭제할 작업자를 선택하세요."); + return; + } + + const ids = Array.from(checkedBoxes).map(cb => cb.value); + selectedIdsInput.value = ids.join(","); + + deleteModal.style.display = "flex"; + }); + } + + if (deleteCancel) { + deleteCancel.addEventListener("click", () => { deleteModal.style.display = "none"; - } - }); -} + }); + } + + if (deleteModal) { + deleteModal.addEventListener("click", (e) => { + if (e.target === deleteModal) { + deleteModal.style.display = "none"; + } + }); + } +}); diff --git a/src/main/webapp/WEB-INF/views/inspectors/inspectorDetail.jsp b/src/main/webapp/WEB-INF/views/inspectors/inspectorDetail.jsp index 0f9ce2e..fea9dcb 100644 --- a/src/main/webapp/WEB-INF/views/inspectors/inspectorDetail.jsp +++ b/src/main/webapp/WEB-INF/views/inspectors/inspectorDetail.jsp @@ -25,11 +25,11 @@
이름 - ${inspector.name} + ${inspectorName}
연락처 - ${inspector.phone} + ${phone}
@@ -41,19 +41,35 @@
담당 구역
- - ${f.domain} - + + + + ${f.domain} + + + + 없음 + +
+
담당 시설
- - ${f.facility} - + + + + ${f.facility} + + + + 없음 + +
+
diff --git a/src/main/webapp/WEB-INF/views/inspectors/inspectorsList.jsp b/src/main/webapp/WEB-INF/views/inspectors/inspectorsList.jsp index ac1c787..b39dde7 100644 --- a/src/main/webapp/WEB-INF/views/inspectors/inspectorsList.jsp +++ b/src/main/webapp/WEB-INF/views/inspectors/inspectorsList.jsp @@ -1,7 +1,6 @@ <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <%@ taglib prefix="c" uri="jakarta.tags.core" %> <%@ taglib prefix="fmt" uri="jakarta.tags.fmt" %> -<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %> @@ -16,17 +15,14 @@ -
+