From 3027d6d3ab79dcf357c7ff6842dd71bea928fe15 Mon Sep 17 00:00:00 2001 From: Jay Sheen Date: Mon, 29 Sep 2025 16:26:13 +0900 Subject: [PATCH 1/2] =?UTF-8?q?=EB=A9=94=EB=89=B4=EB=B3=84=20=EA=B6=8C?= =?UTF-8?q?=ED=95=9C=20=EA=B4=80=EB=A6=AC=20=EA=B8=B0=EB=8A=A5=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - defaultGrant 값에 따른 권한 항목 조건부 표시 구현 - 권한 상태 관리 로직 개선 (초기값과 기본값 분리) - API 응답 구조 타입 수정 및 처리 로직 개선 - 거래취소 비밀번호 변경 페이지 오타 수정 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- .../account/ui/user-account-auth-wrap.tsx | 15 ++--- src/entities/user/model/types.ts | 4 +- .../password/modify-cancel-password-page.tsx | 21 ++++--- src/pages/account/user/menu-auth-page.tsx | 61 +++++++++++++------ src/shared/api/api-url-user.ts | 2 +- 5 files changed, 65 insertions(+), 38 deletions(-) diff --git a/src/entities/account/ui/user-account-auth-wrap.tsx b/src/entities/account/ui/user-account-auth-wrap.tsx index d1e9088..05b39fe 100644 --- a/src/entities/account/ui/user-account-auth-wrap.tsx +++ b/src/entities/account/ui/user-account-auth-wrap.tsx @@ -13,7 +13,7 @@ export const UserAccountAuthWrap = ({ }: UserAccountAuthWrapProps) => { const [currentStatus, setCurrentStatus] = useState(status); const [currentIdCL, setCurrentIdCl] = useState(idCL); - const [menuGrants, setMenuGrants] = useState>([]); + const [permissions, setPermissions] = useState>([]); const [hasChanges, setHasChanges] = useState(false); console.log('mid : ', mid); console.log('usrid : ', usrid); @@ -24,20 +24,21 @@ export const UserAccountAuthWrap = ({ useEffect(() => { if (mid && usrid) { console.log('userMenuPermissions'); - userMenuPermissions({mid: mid, usrid: usrid}).then((res) => { + userMenuPermissions({mid: mid, usrid: usrid}).then((res: any) => { console.log('res : ', res); - setMenuGrants(res?.data || res || []); + console.log('permissions : ', res?.permissions); + setPermissions(res?.permissions || []); }).catch((error) => { console.error('Failed to fetch menu permissions:', error); - setMenuGrants([]); + setPermissions([]); }); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [mid, usrid]); useEffect(() => { - console.log('menuGrants : ', menuGrants); - }, [menuGrants]); + console.log('permissions : ', permissions); + }, [permissions]); // 변경 사항 감지 useEffect(() => { @@ -139,7 +140,7 @@ export const UserAccountAuthWrap = ({ idCL={ currentIdCL } status={ currentStatus } menuItems={ menuItems } - menuGrants={ menuGrants } + menuGrants={ permissions } >
diff --git a/src/entities/user/model/types.ts b/src/entities/user/model/types.ts index c923810..925e39e 100644 --- a/src/entities/user/model/types.ts +++ b/src/entities/user/model/types.ts @@ -110,8 +110,7 @@ export interface UserMenuPermissionsParams { } export interface UserMenuPermissionsResponse { - status: boolean; - data: Array; + permissions: Array; } export interface UserMenuPermissionsSaveParams { @@ -129,6 +128,7 @@ export interface UserMenuPermissionData { menuId: number; usrid: string; grant: number; + defaultGrant: number; } export interface ChangePasswordParams { diff --git a/src/pages/account/password/modify-cancel-password-page.tsx b/src/pages/account/password/modify-cancel-password-page.tsx index f2d8f21..ca6ddf1 100644 --- a/src/pages/account/password/modify-cancel-password-page.tsx +++ b/src/pages/account/password/modify-cancel-password-page.tsx @@ -14,14 +14,14 @@ import { snackBar } from '@/shared/lib/toast'; export const PasswordModifyCancelPasswordPage = () => { const { navigate } = useNavigate(); const [mid, setMid] = useState('nictest00m'); - const [newPassword, setNewPassword] = useState(''); + const [password, setPassword] = useState(''); const [confirmPassword, setConfirmPassword] = useState(''); const changeCancelPasswordMutation = useUserChangeCancelPasswordMutation({ onSuccess: () => { snackBar('비밀번호가 성공적으로 변경되었습니다.'); // Clear form - setNewPassword(''); + setPassword(''); setConfirmPassword(''); // Navigate back navigate(PATHS.account.password.manage); @@ -32,6 +32,7 @@ export const PasswordModifyCancelPasswordPage = () => { }); const midList = [ + { value: 'nictest00', label: 'nictest00' }, { value: 'nictest00m', label: 'nictest00m' }, { value: 'nictest01m', label: 'nictest01m' }, { value: 'nictest02m', label: 'nictest02m' }, @@ -47,9 +48,9 @@ export const PasswordModifyCancelPasswordPage = () => { // 저장 버튼 활성화 조건 체크 const isFormValid = () => { return ( - newPassword.length >= 8 && + password.length >= 8 && confirmPassword.length >= 8 && - newPassword === confirmPassword + password === confirmPassword ); }; @@ -60,7 +61,7 @@ export const PasswordModifyCancelPasswordPage = () => { // TODO: Validate current password before submitting changeCancelPasswordMutation.mutate({ mid, - password: newPassword + password: password }); }; @@ -82,24 +83,24 @@ export const PasswordModifyCancelPasswordPage = () => {
변경 비밀번호 *
setNewPassword(e.target.value)} + value={password} + onChange={(e) => setPassword(e.target.value)} />
변경 비밀번호 재입력 *
setConfirmPassword(e.target.value)} />
- {confirmPassword && newPassword !== confirmPassword && ( + {confirmPassword && password !== confirmPassword && (
입력 정보 불일치
)}
diff --git a/src/pages/account/user/menu-auth-page.tsx b/src/pages/account/user/menu-auth-page.tsx index 4d65047..c713a8d 100644 --- a/src/pages/account/user/menu-auth-page.tsx +++ b/src/pages/account/user/menu-auth-page.tsx @@ -30,11 +30,19 @@ export const UserMenuAuthPage = () => { // 메뉴별 권한 상태 관리 const [permissions, setPermissions] = useState>({}); const [initialPermissions, setInitialPermissions] = useState>({}); + const [defaultPermissions, setDefaultPermissions] = useState>({}); const [hasChanges, setHasChanges] = useState(false); const savePermissionsMutation = useUserMenuPermissionsSaveMutation({ onSuccess: () => { snackBar('권한이 성공적으로 저장되었습니다.'); - navigate(PATHS.account.password.manage); + navigate(PATHS.account.user.accountAuth, { + state: { + mid, + usrid, + idCl: location.state?.idCl, + status: location.state?.status + } + }); }, onError: (error) => { snackBar(error?.response?.data?.message || '권한 저장에 실패했습니다.'); @@ -84,12 +92,15 @@ export const UserMenuAuthPage = () => { useEffect(() => { if (menuGrants && Array.isArray(menuGrants) && menuGrants.length > 0) { // menuGrants 데이터가 있으면 사용 - const initial: Record = {}; - menuGrants.forEach((grant: { menuId: number; grant: number }) => { - initial[grant.menuId] = grant.grant || 0; + const grants: Record = {}; + const defaultGrants: Record = {}; + menuGrants.forEach((grant: { menuId: number; grant: number; defaultGrant: number }) => { + grants[grant.menuId] = grant.grant || 0; + defaultGrants[grant.menuId] = grant.defaultGrant || 0; }); - setPermissions(initial); - setInitialPermissions(initial); + setPermissions(grants); + setInitialPermissions(grants); // 초기값은 현재 grant 값으로 설정 + setDefaultPermissions(defaultGrants); // defaultGrant는 별도로 관리 } else { // menuGrants가 없거나 빈 배열이면 API에서 권한 조회 // loadPermissions(); @@ -114,6 +125,11 @@ export const UserMenuAuthPage = () => { return (grant & flag) === flag; }; + const hasDefaultPermission = (menuId: number, flag: number): boolean => { + const grant = defaultPermissions[menuId] || 0; + return (grant & flag) === flag; + }; + // 권한 토글 처리 const togglePermission = (menuId: number, flag: number) => { setPermissions(prev => { @@ -152,7 +168,8 @@ export const UserMenuAuthPage = () => { ([menuId, grant]) => ({ menuId: Number(menuId), usrid: usrid, - grant: grant + grant: grant, + defaultGrant: defaultPermissions[Number(menuId)] || 0 }) ); @@ -210,17 +227,21 @@ export const UserMenuAuthPage = () => { }} >
-
- 저장 - -
+ {hasDefaultPermission(menu.menuId, PERMISSION.SAVE) && ( +
+ 저장 + +
+ )} + + {hasDefaultPermission(menu.menuId, PERMISSION.EXECUTE) && (
실행
+ )} + + {hasDefaultPermission(menu.menuId, PERMISSION.DOWNLOAD) && (
다운로드
+ )}
diff --git a/src/shared/api/api-url-user.ts b/src/shared/api/api-url-user.ts index b16aa21..676cc75 100644 --- a/src/shared/api/api-url-user.ts +++ b/src/shared/api/api-url-user.ts @@ -42,6 +42,6 @@ export const API_URL_USER = { return `${API_BASE_URL}/api/v1/${API_URL_KEY}/user/password`; }, userChangeCancelPassword: () => { - return `${API_BASE_URL}/api/v1/${API_URL_KEY}/user/cancel/change`; + return `${API_BASE_URL}/api/v1/${API_URL_KEY}/user/cancle/change`; } } \ No newline at end of file From 6008abb9a6497be1c9c30cfae9c0588a8d00a5de Mon Sep 17 00:00:00 2001 From: Jay Sheen Date: Mon, 29 Sep 2025 16:57:48 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=EB=A9=94=EB=89=B4=EC=9D=B4=EB=A6=84=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../account/ui/user-account-auth-wrap.tsx | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/src/entities/account/ui/user-account-auth-wrap.tsx b/src/entities/account/ui/user-account-auth-wrap.tsx index 05b39fe..fc64a71 100644 --- a/src/entities/account/ui/user-account-auth-wrap.tsx +++ b/src/entities/account/ui/user-account-auth-wrap.tsx @@ -51,7 +51,7 @@ export const UserAccountAuthWrap = ({ {menuId: '30', parent: '30', menuName: '거래조회', subMenu: [ {menuId: '31', parent: '30', menuName: '거래내역조회'}, - {menuId: '32', parent: '30', menuName: '현금영수증 발행'}, + {menuId: '32', parent: '30', menuName: '현금영수증발행'}, {menuId: '33', parent: '30', menuName: '에스크로'}, {menuId: '34', parent: '30', menuName: '빌링'} ] @@ -62,15 +62,15 @@ export const UserAccountAuthWrap = ({ {menuId: '37', parent: '35', menuName: '정산내역'}, ] }, - {menuId: '38', parent: '38', menuName: '가맹점 관리', subMenu: + {menuId: '38', parent: '38', menuName: '가맹점관리', subMenu: [ - {menuId: '39', parent: '38', menuName: '가맹점 정보'}, - {menuId: '40', parent: '38', menuName: '등록 현황'}, + {menuId: '39', parent: '38', menuName: '가맹점정보'}, + {menuId: '40', parent: '38', menuName: '등록현황'}, ] }, - {menuId: '41', parent: '41', menuName: '결제 관리', subMenu: + {menuId: '41', parent: '41', menuName: '결제관리', subMenu: [ - {menuId: '42', parent: '41', menuName: '결제 정보'}, + {menuId: '42', parent: '41', menuName: '결제정보'}, {menuId: '43', parent: '41', menuName: '결제데이터통보'}, ] }, @@ -82,7 +82,7 @@ export const UserAccountAuthWrap = ({ }, {menuId: '47', parent: '47', menuName: '부가세신고자료', subMenu: [ - {menuId: '48', parent: '47', menuName: '부가세신고자료'}, + {menuId: '48', parent: '47', menuName: '세금계산서'}, {menuId: '49', parent: '47', menuName: '부가세참고'}, ] }, @@ -90,14 +90,14 @@ export const UserAccountAuthWrap = ({ [ {menuId: '51', parent: '50', menuName: '부가서비스소개'}, {menuId: '52', parent: '50', menuName: '신용카드ARS카드결제'}, - {menuId: '53', parent: '50', menuName: '계좌이체ARS카드결제'}, - {menuId: '54', parent: '50', menuName: '가상계좌ARS카드결제'}, - {menuId: '55', parent: '50', menuName: '휴대폰ARS카드결제'}, - {menuId: '56', parent: '50', menuName: '계좌간편결제ARS카드결제'}, - {menuId: '57', parent: '50', menuName: 'SSG머니ARS카드결제'}, - {menuId: '58', parent: '50', menuName: 'SSG은행계좌ARS카드결제'}, - {menuId: '59', parent: '50', menuName: '문화상품권ARS카드결제'}, - {menuId: '60', parent: '50', menuName: '티머니페이ARS카드결제'}, + {menuId: '53', parent: '50', menuName: '지급대행'}, + {menuId: '54', parent: '50', menuName: '링크결제'}, + {menuId: '55', parent: '50', menuName: '자금이체'}, + {menuId: '56', parent: '50', menuName: 'KEY-IN결제'}, + {menuId: '57', parent: '50', menuName: 'SMS결제통보'}, + {menuId: '58', parent: '50', menuName: '알림톡결제통보'}, + {menuId: '59', parent: '50', menuName: '계좌점유인증'}, + {menuId: '60', parent: '50', menuName: '계좌성명조회'}, ] }, {menuId: '61', parent: '61', menuName: '고객지원', subMenu: