diff --git a/src/main/java/com/eactive/apim/portal/apps/agreements/controller/AgreementsController.java b/src/main/java/com/eactive/apim/portal/apps/agreements/controller/AgreementsController.java index c147887..ad5526c 100644 --- a/src/main/java/com/eactive/apim/portal/apps/agreements/controller/AgreementsController.java +++ b/src/main/java/com/eactive/apim/portal/apps/agreements/controller/AgreementsController.java @@ -1,10 +1,16 @@ package com.eactive.apim.portal.apps.agreements.controller; import com.eactive.apim.portal.agreements.entity.AgreementType; +import com.eactive.apim.portal.agreements.service.AgreementTypeConfigService; +import com.eactive.apim.portal.apps.agreements.dto.AgreementTabDTO; import com.eactive.apim.portal.apps.agreements.dto.AgreementsDTO; import com.eactive.apim.portal.apps.agreements.service.AgreementsFacade; import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Collections; +import java.util.EnumMap; import java.util.List; +import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -21,38 +27,56 @@ public class AgreementsController { public static final String PRIVACY_POLICY_EXTERNAL_URL = "https://www.jejubank.co.kr/hmpg/csct/secuCenr/ptctPlcy/procsPlcy/ctnt.do"; + /** + * 약관 종류별 {@code tab} 파라미터 값. 기존 북마크/외부 링크 호환을 위해 슬러그를 유지한다. + * (초대 팝업 등에서 {@code tab=notification} 으로 직접 링크한다) + */ + private static final Map TAB_SLUGS = new EnumMap<>(AgreementType.class); + + static { + TAB_SLUGS.put(AgreementType.TERMS_OF_USE, "terms"); + TAB_SLUGS.put(AgreementType.PRIVACY_POLICY, "privacy"); + TAB_SLUGS.put(AgreementType.PRIVACY_COLLECT, "privacy-collect"); + TAB_SLUGS.put(AgreementType.PRIVACY_COLLECT_IND, "privacy-collect-ind"); + TAB_SLUGS.put(AgreementType.PRIVACY_COLLECT_ORG, "privacy-collect-org"); + TAB_SLUGS.put(AgreementType.NOTIFICATION_CONSENT, "notification"); + } + private final AgreementsFacade agreementsFacade; + private final AgreementTypeConfigService agreementTypeConfigService; @Autowired - public AgreementsController(AgreementsFacade agreementsFacade) { + public AgreementsController(AgreementsFacade agreementsFacade, + AgreementTypeConfigService agreementTypeConfigService) { this.agreementsFacade = agreementsFacade; + this.agreementTypeConfigService = agreementTypeConfigService; } @GetMapping("/terms") public String showTerms(@RequestParam(required = false) String tab, @RequestParam(required = false) String publishedOn, Model model) { - String currentTab = tab != null ? tab : "terms"; - // 구 개인정보처리방침 탭(tab=privacy)은 외부 링크로 이동했으므로 외부 URL로 리다이렉트(북마크 호환) - if ("privacy".equals(currentTab)) { + if ("privacy".equals(tab)) { return "redirect:" + PRIVACY_POLICY_EXTERNAL_URL; } - AgreementType type; - switch (currentTab) { - case "privacy-collect": - // 개인정보수집동의서 = PRIVACY_COLLECT (신설항목) - type = AgreementType.PRIVACY_COLLECT; - break; - case "notification": - type = AgreementType.NOTIFICATION_CONSENT; - break; - case "terms": - default: - currentTab = "terms"; - type = AgreementType.TERMS_OF_USE; - break; + // 노출 대상과 순서는 관리 콘솔의 '약관 종류 관리'에서 설정한다 + List displayTypes = agreementTypeConfigService.getDisplayTypes(); + + // 요청한 탭이 노출 대상이 아니면(미배치/사용안함) 첫 번째 탭으로 보정한다 + AgreementType type = resolveType(tab, displayTypes); + + if (type == null) { + // 노출할 약관 종류가 하나도 없는 경우 — 빈 화면으로 방어 + model.addAttribute("termsTabs", Collections.emptyList()); + model.addAttribute("agreementsList", Collections.emptyList()); + model.addAttribute("selectedAgreement", null); + model.addAttribute("selectedDate", publishedOn); + model.addAttribute("agreementTitle", "약관"); + model.addAttribute("agreementType", null); + model.addAttribute("currentTab", null); + return TERMS_AGREEMENTS; } List agreementsList = agreementsFacade.getAgreementsList(String.valueOf(type)); @@ -68,17 +92,40 @@ public class AgreementsController { model.addAttribute("selectedAgreement", selectedAgreement); model.addAttribute("selectedDate", publishedOn); - model.addAttribute("isTermsOfUse", type == AgreementType.TERMS_OF_USE); - model.addAttribute("isPrivacyCollect", type == AgreementType.PRIVACY_COLLECT); - model.addAttribute("isNotification", type == AgreementType.NOTIFICATION_CONSENT); + model.addAttribute("termsTabs", buildTabs(displayTypes, type)); model.addAttribute("agreementTitle", type.getDescription()); model.addAttribute("agreementType", type.getCode()); - - model.addAttribute("currentTab", currentTab); + model.addAttribute("currentTab", TAB_SLUGS.get(type)); return TERMS_AGREEMENTS; } + /** 요청한 탭 슬러그를 노출 대상 약관 종류로 해석한다. 없거나 노출 대상이 아니면 첫 번째 탭. */ + private AgreementType resolveType(String tab, List displayTypes) { + if (displayTypes.isEmpty()) { + return null; + } + if (tab != null && !tab.isEmpty()) { + for (AgreementType displayType : displayTypes) { + if (tab.equals(TAB_SLUGS.get(displayType))) { + return displayType; + } + } + } + return displayTypes.get(0); + } + + private List buildTabs(List displayTypes, AgreementType currentType) { + List tabs = new ArrayList<>(); + for (AgreementType displayType : displayTypes) { + tabs.add(new AgreementTabDTO( + TAB_SLUGS.get(displayType), + displayType.getDescription(), + displayType == currentType)); + } + return tabs; + } + private AgreementsDTO findAgreementByDate(List agreements, String publishedOn) { return agreements.stream() .filter(a -> publishedOn.equals( diff --git a/src/main/java/com/eactive/apim/portal/apps/agreements/dto/AgreementTabDTO.java b/src/main/java/com/eactive/apim/portal/apps/agreements/dto/AgreementTabDTO.java new file mode 100644 index 0000000..dc802a5 --- /dev/null +++ b/src/main/java/com/eactive/apim/portal/apps/agreements/dto/AgreementTabDTO.java @@ -0,0 +1,24 @@ +package com.eactive.apim.portal.apps.agreements.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 약관 페이지({@code /agreements/terms})의 탭 하나. + * + *

노출 대상과 순서는 관리 콘솔의 '약관 종류 관리'에서 설정한 값 + * ({@code PTL_PROPERTY Portal/portal.terms.display-types})을 따른다. + */ +@Getter +@AllArgsConstructor +public class AgreementTabDTO { + + /** URL 파라미터 {@code tab} 값 (북마크 호환을 위해 기존 슬러그를 유지한다) */ + private final String tab; + + /** 탭에 표시할 약관명 */ + private final String title; + + /** 현재 선택된 탭인지 여부 */ + private final boolean active; +} diff --git a/src/main/java/com/eactive/apim/portal/apps/agreements/service/AgreementFormModelSupport.java b/src/main/java/com/eactive/apim/portal/apps/agreements/service/AgreementFormModelSupport.java new file mode 100644 index 0000000..01e8d3c --- /dev/null +++ b/src/main/java/com/eactive/apim/portal/apps/agreements/service/AgreementFormModelSupport.java @@ -0,0 +1,54 @@ +package com.eactive.apim.portal.apps.agreements.service; + +import com.eactive.apim.portal.agreements.entity.AgreementType; +import com.eactive.apim.portal.agreements.service.AgreementTypeConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.ui.Model; + +import java.util.Set; + +/** + * 약관 동의 폼({@code apps/register/userAgreementContent :: agreementContent})에 필요한 모델 속성을 채운다. + * + *

관리 콘솔의 '약관 종류 관리'에서 사용하지 않도록 설정한 약관 종류는 동의 항목 자체를 노출하지 않는다 + * ({@code show*} 플래그가 {@code false} 이고 내용도 {@code null}). + * + * @see AgreementTypeConfigService + */ +@Component +@RequiredArgsConstructor +public class AgreementFormModelSupport { + + private final AgreementsFacade agreementsFacade; + private final AgreementTypeConfigService agreementTypeConfigService; + + /** 이용약관 / 개인정보수집동의서 / 알림 수신 동의서 모델 속성을 사용 여부에 맞춰 채운다. */ + public void applyAgreements(Model model) { + applyAgreeAllMode(model); + + Set enabledTypes = agreementTypeConfigService.getEnabledTypes(); + + applyAgreement(model, enabledTypes, AgreementType.TERMS_OF_USE, "termsOfUse", "showTermsOfUse"); + applyAgreement(model, enabledTypes, AgreementType.PRIVACY_COLLECT, "privacyCollect", "showPrivacyCollect"); + applyAgreement(model, enabledTypes, AgreementType.NOTIFICATION_CONSENT, "notificationConsent", + "showNotificationConsent"); + } + + /** + * '전체 동의' 허용 여부만 모델에 담는다. + * + *

동의 항목 구성은 그대로 두고 동의 방식만 설정에 맞추면 되는 화면(법인 전환 등)에서 쓴다. + * {@code false} 면 '전체 동의' 체크박스를 숨기고 항목별로 끝까지 읽어야 동의할 수 있다. + */ + public void applyAgreeAllMode(Model model) { + model.addAttribute("agreeAllEnabled", agreementTypeConfigService.isAgreeAllEnabled()); + } + + private void applyAgreement(Model model, Set enabledTypes, AgreementType type, + String contentAttribute, String flagAttribute) { + boolean enabled = enabledTypes.contains(type); + model.addAttribute(flagAttribute, enabled); + model.addAttribute(contentAttribute, enabled ? agreementsFacade.getAgreement(type.getCode()) : null); + } +} diff --git a/src/main/java/com/eactive/apim/portal/apps/user/controller/AccountController.java b/src/main/java/com/eactive/apim/portal/apps/user/controller/AccountController.java index 05eaa6a..e8b68d0 100644 --- a/src/main/java/com/eactive/apim/portal/apps/user/controller/AccountController.java +++ b/src/main/java/com/eactive/apim/portal/apps/user/controller/AccountController.java @@ -1,5 +1,6 @@ package com.eactive.apim.portal.apps.user.controller; +import com.eactive.apim.portal.apps.agreements.service.AgreementFormModelSupport; import com.eactive.apim.portal.apps.agreements.service.AgreementsFacade; import com.eactive.apim.portal.apps.auth.twofactor.StepUpProtectedPaths; import com.eactive.apim.portal.apps.auth.twofactor.TwoFactorProperties; @@ -51,6 +52,7 @@ public class AccountController { private final UserFacade userFacade; private final OrgRegisterFacade orgRegisterFacade; private final AgreementsFacade agreementsFacade; + private final AgreementFormModelSupport agreementFormModelSupport; private final com.eactive.apim.portal.apps.user.facade.AuthFacade authFacade; private final UserInvitationRepository userInvitationRepository; private final UserSessionService userSessionService; @@ -365,6 +367,8 @@ public class AccountController { model.addAttribute("termsOfUse", agreementsFacade.getAgreement("TERMS_OF_USE")); model.addAttribute("privacyCollect", agreementsFacade.getAgreement("PRIVACY_COLLECT")); model.addAttribute("registrationType", "corporate"); + // 동의 항목 구성은 이 화면 그대로 두고 '전체 동의' 허용 여부만 설정을 따른다 + agreementFormModelSupport.applyAgreeAllMode(model); return "apps/mypage/orgTransfer"; } catch (Exception e) { diff --git a/src/main/java/com/eactive/apim/portal/apps/user/controller/OrgRegisterController.java b/src/main/java/com/eactive/apim/portal/apps/user/controller/OrgRegisterController.java index f58521c..9a9b709 100644 --- a/src/main/java/com/eactive/apim/portal/apps/user/controller/OrgRegisterController.java +++ b/src/main/java/com/eactive/apim/portal/apps/user/controller/OrgRegisterController.java @@ -1,6 +1,6 @@ package com.eactive.apim.portal.apps.user.controller; -import com.eactive.apim.portal.apps.agreements.service.AgreementsFacade; +import com.eactive.apim.portal.apps.agreements.service.AgreementFormModelSupport; import com.eactive.apim.portal.apps.user.dto.PortalOrgRegistrationDTO; import com.eactive.apim.portal.apps.user.dto.UserAgreementDTO; import com.eactive.apim.portal.apps.user.dto.ValidationResponse; @@ -21,7 +21,7 @@ public class OrgRegisterController { private static final String MAIN_ORG_REGISTER = "apps/register/orgUserRegister"; private static final String MAIN_REGISTER_RESULT = "apps/register/userRegisterResult"; - private final AgreementsFacade agreementsFacade; + private final AgreementFormModelSupport agreementFormModelSupport; private final PortalProperties portalProperties; private final OrgRegisterFacade orgRegisterFacade; @@ -30,9 +30,8 @@ public class OrgRegisterController { model.addAttribute("registrationType", "corporate"); model.addAttribute("authTtl", portalProperties.getAuthTtl()); model.addAttribute("portalOrg", new PortalOrgRegistrationDTO()); - model.addAttribute("termsOfUse", agreementsFacade.getAgreement("TERMS_OF_USE")); - model.addAttribute("privacyCollect", agreementsFacade.getAgreement("PRIVACY_COLLECT")); - model.addAttribute("notificationConsent", agreementsFacade.getAgreement("NOTIFICATION_CONSENT")); + // 사용하지 않도록 설정한 약관 종류는 동의 항목을 노출하지 않는다 (관리 콘솔 > 약관 종류 관리) + agreementFormModelSupport.applyAgreements(model); return MAIN_ORG_REGISTER; } @@ -105,8 +104,7 @@ public class OrgRegisterController { model.addAttribute("registrationType", "corporate"); model.addAttribute("portalOrg", orgDTO); model.addAttribute("error", errorMessage); - model.addAttribute("termsOfUse", agreementsFacade.getAgreement("TERMS_OF_USE")); - model.addAttribute("privacyCollect", agreementsFacade.getAgreement("PRIVACY_COLLECT")); - model.addAttribute("notificationConsent", agreementsFacade.getAgreement("NOTIFICATION_CONSENT")); + // 사용하지 않도록 설정한 약관 종류는 동의 항목을 노출하지 않는다 (관리 콘솔 > 약관 종류 관리) + agreementFormModelSupport.applyAgreements(model); } } diff --git a/src/main/java/com/eactive/apim/portal/apps/user/controller/UserManController.java b/src/main/java/com/eactive/apim/portal/apps/user/controller/UserManController.java index 6d6d633..4a340ed 100644 --- a/src/main/java/com/eactive/apim/portal/apps/user/controller/UserManController.java +++ b/src/main/java/com/eactive/apim/portal/apps/user/controller/UserManController.java @@ -1,5 +1,7 @@ package com.eactive.apim.portal.apps.user.controller; +import com.eactive.apim.portal.agreements.entity.AgreementType; +import com.eactive.apim.portal.agreements.service.AgreementTypeConfigService; import com.eactive.apim.portal.apps.user.dto.PortalUserDTO; import com.eactive.apim.portal.apps.user.facade.UserManFacade; import com.eactive.apim.portal.common.util.SecurityUtil; @@ -24,6 +26,7 @@ import org.springframework.web.bind.annotation.RequestParam; public class UserManController { private final UserManFacade userManFacade; + private final AgreementTypeConfigService agreementTypeConfigService; @GetMapping public String userList(@PageableDefault(sort = "createdDate", direction = Sort.Direction.DESC) Pageable pageable, Model model) { @@ -34,6 +37,10 @@ public class UserManController { model.addAttribute("pendingUsers", pendingUsers); model.addAttribute("page", users); model.addAttribute("currentUserId", SecurityUtil.getPortalAuthenticatedUser().getId()); + // 초대/초대 취소 팝업의 알림 수신 동의 체크박스 노출 여부. + // 약관 페이지에 배치되어 있어야(= 사용 중이고 미배치가 아니어야) 동의서 링크를 안내할 수 있다. + model.addAttribute("notificationConsentAvailable", + agreementTypeConfigService.isDisplayed(AgreementType.NOTIFICATION_CONSENT)); return "apps/users/userList"; } diff --git a/src/main/java/com/eactive/apim/portal/apps/user/controller/UserRegisterController.java b/src/main/java/com/eactive/apim/portal/apps/user/controller/UserRegisterController.java index 78ca8a7..a2b2a8e 100644 --- a/src/main/java/com/eactive/apim/portal/apps/user/controller/UserRegisterController.java +++ b/src/main/java/com/eactive/apim/portal/apps/user/controller/UserRegisterController.java @@ -1,6 +1,6 @@ package com.eactive.apim.portal.apps.user.controller; -import com.eactive.apim.portal.apps.agreements.service.AgreementsFacade; +import com.eactive.apim.portal.apps.agreements.service.AgreementFormModelSupport; import com.eactive.apim.portal.apps.user.dto.PortalUserRegistrationDTO; import com.eactive.apim.portal.apps.user.dto.UserAgreementDTO; import com.eactive.apim.portal.apps.user.dto.ValidationResponse; @@ -54,7 +54,7 @@ public class UserRegisterController { private final AuthFacade authFacade; private final PortalUserRepository portalUserRepository; private final PortalOrgRepository portalOrgRepository; - private final AgreementsFacade agreementsFacade; + private final AgreementFormModelSupport agreementFormModelSupport; private final PortalProperties portalProperties; private final UserInvitationRepository userInvitationRepository; private final AgreementValidator agreementValidator; @@ -94,9 +94,8 @@ public class UserRegisterController { model.addAttribute("authTtl", portalProperties.getAuthTtl()); model.addAttribute("portalUser", new PortalUserRegistrationDTO()); - model.addAttribute("termsOfUse", agreementsFacade.getAgreement("TERMS_OF_USE")); - model.addAttribute("privacyCollect", agreementsFacade.getAgreement("PRIVACY_COLLECT")); - model.addAttribute("notificationConsent", agreementsFacade.getAgreement("NOTIFICATION_CONSENT")); + // 사용하지 않도록 설정한 약관 종류는 동의 항목을 노출하지 않는다 (관리 콘솔 > 약관 종류 관리) + agreementFormModelSupport.applyAgreements(model); return MAIN_USER_REGISTER; @@ -360,9 +359,8 @@ public class UserRegisterController { model.addAttribute("userName", SecurityUtil.getPortalAuthenticatedUser().getUsername()); model.addAttribute("orgName", org.get().getOrgName()); model.addAttribute("invitationCode", invitation.get().getToken()); - model.addAttribute("termsOfUse", agreementsFacade.getAgreement("TERMS_OF_USE")); - model.addAttribute("privacyCollect", agreementsFacade.getAgreement("PRIVACY_COLLECT")); - model.addAttribute("notificationConsent", agreementsFacade.getAgreement("NOTIFICATION_CONSENT")); + // 사용하지 않도록 설정한 약관 종류는 동의 항목을 노출하지 않는다 (관리 콘솔 > 약관 종류 관리) + agreementFormModelSupport.applyAgreements(model); model.addAttribute("agreementTitle", "법인 회원 전환을 위한 약관 동의"); model.addAttribute("registrationType", "corporate"); @@ -391,9 +389,8 @@ public class UserRegisterController { model.addAttribute("userName", SecurityUtil.getPortalAuthenticatedUser().getUsername()); model.addAttribute("orgName", org.get().getOrgName()); - model.addAttribute("termsOfUse", agreementsFacade.getAgreement("TERMS_OF_USE")); - model.addAttribute("privacyCollect", agreementsFacade.getAgreement("PRIVACY_COLLECT")); - model.addAttribute("notificationConsent", agreementsFacade.getAgreement("NOTIFICATION_CONSENT")); + // 사용하지 않도록 설정한 약관 종류는 동의 항목을 노출하지 않는다 (관리 콘솔 > 약관 종류 관리) + agreementFormModelSupport.applyAgreements(model); model.addAttribute("agreementTitle", "법인 회원 전환을 위한 약관 동의"); model.addAttribute("registrationType", "corporate"); @@ -435,9 +432,8 @@ public class UserRegisterController { model.addAttribute("error", errorMessage); model.addAttribute("agreement", agreement); - model.addAttribute("termsOfUse", agreementsFacade.getAgreement("TERMS_OF_USE")); - model.addAttribute("privacyCollect", agreementsFacade.getAgreement("PRIVACY_COLLECT")); - model.addAttribute("notificationConsent", agreementsFacade.getAgreement("NOTIFICATION_CONSENT")); + // 사용하지 않도록 설정한 약관 종류는 동의 항목을 노출하지 않는다 (관리 콘솔 > 약관 종류 관리) + agreementFormModelSupport.applyAgreements(model); model.addAttribute("msgType", "sms"); } diff --git a/src/main/resources/templates/views/apps/register/orgUserRegister.html b/src/main/resources/templates/views/apps/register/orgUserRegister.html index 8ea24dd..5caab06 100644 --- a/src/main/resources/templates/views/apps/register/orgUserRegister.html +++ b/src/main/resources/templates/views/apps/register/orgUserRegister.html @@ -377,10 +377,13 @@ return false; } + // 사용하지 않도록 설정한 약관은 화면에 없으므로(관리 콘솔 > 약관 종류 관리) 없으면 통과 처리 + const termsOfUseEl = document.getElementById('termsOfUse'); + const privacyCollectEl = document.getElementById('privacyCollect'); const notificationConsentEl = document.getElementById('notificationConsent'); const validations = { - termsOfUse: $('#termsOfUse').prop('checked'), - privacyPolicy: $('#privacyCollect').prop('checked'), + termsOfUse: !termsOfUseEl || termsOfUseEl.checked, + privacyPolicy: !privacyCollectEl || privacyCollectEl.checked, notificationConsent: !notificationConsentEl || notificationConsentEl.checked, compRegNo: $('#compRegNo').val().trim() !== '', corpRegNo: $('#corpRegNo').val().trim() !== '', @@ -423,13 +426,15 @@ } // 공통 항목 + const termsOfUseEl = document.getElementById('termsOfUse'); + const privacyCollectEl = document.getElementById('privacyCollect'); const notificationConsentEl = document.getElementById('notificationConsent'); if ($('#orgName').val().trim() === '') errors.push('회사명을 입력해주세요.'); if ($('#compRegNo').val().trim() === '') errors.push('사업자등록번호를 올바르게 입력해주세요.'); if ($('#corpRegNo').val().trim() === '') errors.push('법인등록번호를 올바르게 입력해주세요.'); if ($('#compRegFile').val().trim() === '') errors.push('사업자등록증 파일을 첨부해주세요.'); - if (!$('#termsOfUse').prop('checked')) errors.push('이용약관에 동의해주세요.'); - if (!$('#privacyCollect').prop('checked')) errors.push('개인정보 수집·이용에 동의해주세요.'); + if (termsOfUseEl && !termsOfUseEl.checked) errors.push('이용약관에 동의해주세요.'); + if (privacyCollectEl && !privacyCollectEl.checked) errors.push('개인정보 수집·이용에 동의해주세요.'); if (notificationConsentEl && !notificationConsentEl.checked) errors.push('알림 수신에 동의해주세요.'); return errors; diff --git a/src/main/resources/templates/views/apps/register/userAgreementContent.html b/src/main/resources/templates/views/apps/register/userAgreementContent.html index 7059655..cf94361 100644 --- a/src/main/resources/templates/views/apps/register/userAgreementContent.html +++ b/src/main/resources/templates/views/apps/register/userAgreementContent.html @@ -11,83 +11,97 @@

- -
- -
+ + + +
+ +
- -
+ +
+
- -
- - -
- - - -
-
@@ -96,7 +96,7 @@ th:if="${user.userStatus.toString() == 'PENDING'}" th:data-user-id="${user.id}" th:data-user-email="${user.maskedEmailAddr}"> - 초대취소 + 초대 취소
@@ -139,7 +139,7 @@ th:if="${user.userStatus.toString() == 'PENDING'}" th:data-user-id="${user.id}" th:data-user-email="${user.maskedEmailAddr}"> - 초대취소 + 초대 취소 @@ -163,7 +163,7 @@ @@ -180,7 +180,7 @@ @@ -294,7 +294,7 @@ }); } - // Add event listeners to the "개발자 추가" buttons + // Add event listeners to the "개발자 초대" buttons const addUserBtn = document.getElementById('addUserBtn'); if (addUserBtn) { diff --git a/src/main/resources/templates/views/fragment/djbank/terms_agreements.html b/src/main/resources/templates/views/fragment/djbank/terms_agreements.html index 0b1a286..32e3bbb 100644 --- a/src/main/resources/templates/views/fragment/djbank/terms_agreements.html +++ b/src/main/resources/templates/views/fragment/djbank/terms_agreements.html @@ -5,33 +5,25 @@
-

이용 약관

+

이용 약관

-

이용약관

+

이용약관

- -
- + diff --git a/src/main/resources/templates/views/fragment/popup/cancelInvitationPopup.html b/src/main/resources/templates/views/fragment/popup/cancelInvitationPopup.html index 3fed32f..b07b4be 100644 --- a/src/main/resources/templates/views/fragment/popup/cancelInvitationPopup.html +++ b/src/main/resources/templates/views/fragment/popup/cancelInvitationPopup.html @@ -9,7 +9,7 @@
diff --git a/src/main/resources/templates/views/fragment/popup/userInvitePopup.html b/src/main/resources/templates/views/fragment/popup/userInvitePopup.html index 3d8b991..3cd5387 100644 --- a/src/main/resources/templates/views/fragment/popup/userInvitePopup.html +++ b/src/main/resources/templates/views/fragment/popup/userInvitePopup.html @@ -9,7 +9,7 @@