메뉴 앤트디자인 메뉴로 교체
헤더 Breadcrumb 추가, profile 수정
This commit is contained in:
@@ -12,5 +12,6 @@ export const STORAGE_MAIL_COPY = 'copyMailData';
|
|||||||
export const STORAGE_BUSINESS_LOG_SEARCH = 'businessLogSearchParam';
|
export const STORAGE_BUSINESS_LOG_SEARCH = 'businessLogSearchParam';
|
||||||
export const STORAGE_GAME_LOG_CURRENCY_SEARCH = 'gameLogCurrencySearchParam';
|
export const STORAGE_GAME_LOG_CURRENCY_SEARCH = 'gameLogCurrencySearchParam';
|
||||||
export const LOG_ACTION_FAIL_CALIUM_ECHO = 'FailCaliumEchoSystem';
|
export const LOG_ACTION_FAIL_CALIUM_ECHO = 'FailCaliumEchoSystem';
|
||||||
|
export const BATTLE_EVENT_OPERATION_TIME_WAIT_SECONDS = 300;
|
||||||
|
|
||||||
export { INITIAL_PAGE_SIZE, INITIAL_CURRENT_PAGE, INITIAL_PAGE_LIMIT };
|
export { INITIAL_PAGE_SIZE, INITIAL_CURRENT_PAGE, INITIAL_PAGE_LIMIT };
|
||||||
|
|||||||
@@ -103,14 +103,14 @@ export const menuConfig = {
|
|||||||
view: false,
|
view: false,
|
||||||
authLevel: adminAuthLevel.NONE
|
authLevel: adminAuthLevel.NONE
|
||||||
},
|
},
|
||||||
cryptview: {
|
// cryptview: {
|
||||||
title: '크립토 조회',
|
// title: '크립토 조회',
|
||||||
permissions: {
|
// permissions: {
|
||||||
read: authType.cryptoRead
|
// read: authType.cryptoRead
|
||||||
},
|
// },
|
||||||
view: false,
|
// view: false,
|
||||||
authLevel: adminAuthLevel.NONE
|
// authLevel: adminAuthLevel.NONE
|
||||||
},
|
// },
|
||||||
businesslogview: {
|
businesslogview: {
|
||||||
title: '비즈니스 로그 조회',
|
title: '비즈니스 로그 조회',
|
||||||
permissions: {
|
permissions: {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import { NavLink, useNavigate } from 'react-router-dom';
|
import { NavLink, useNavigate, useLocation } from 'react-router-dom';
|
||||||
import arrowIcon from '../../../assets/img/icon/icon-tab.png';
|
import { ConfigProvider, Menu, theme } from 'antd';
|
||||||
import styled from 'styled-components';
|
import styled from 'styled-components';
|
||||||
import { useRecoilValue } from 'recoil';
|
import { useRecoilValue } from 'recoil';
|
||||||
import { authList } from '../../../store/authList';
|
import { authList } from '../../../store/authList';
|
||||||
@@ -7,7 +7,6 @@ import Modal from '../modal/Modal';
|
|||||||
import { BtnWrapper, ButtonClose, ModalText } from '../../../styles/Components';
|
import { BtnWrapper, ButtonClose, ModalText } from '../../../styles/Components';
|
||||||
import { useEffect, useState } from 'react';
|
import { useEffect, useState } from 'react';
|
||||||
import Button from '../button/Button';
|
import Button from '../button/Button';
|
||||||
import { useLocation } from 'react-router-dom';
|
|
||||||
import { AuthInfo } from '../../../apis';
|
import { AuthInfo } from '../../../apis';
|
||||||
import { getMenuConfig } from '../../../utils';
|
import { getMenuConfig } from '../../../utils';
|
||||||
import { adminAuthLevel } from '../../../assets/data/types';
|
import { adminAuthLevel } from '../../../assets/data/types';
|
||||||
@@ -15,47 +14,55 @@ import { adminAuthLevel } from '../../../assets/data/types';
|
|||||||
const Navi = () => {
|
const Navi = () => {
|
||||||
const token = sessionStorage.getItem('token');
|
const token = sessionStorage.getItem('token');
|
||||||
const userInfo = useRecoilValue(authList);
|
const userInfo = useRecoilValue(authList);
|
||||||
const menu = getMenuConfig(userInfo);
|
const menuConfig = getMenuConfig(userInfo);
|
||||||
|
|
||||||
const [modalClose, setModalClose] = useState('hidden');
|
|
||||||
const [logoutModalClose, setLogoutModalClose] = useState('hidden');
|
|
||||||
const location = useLocation();
|
const location = useLocation();
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
|
const [modalClose, setModalClose] = useState('hidden');
|
||||||
|
const [logoutModalClose, setLogoutModalClose] = useState('hidden');
|
||||||
|
const [openKeys, setOpenKeys] = useState([]);
|
||||||
|
const [selectedKeys, setSelectedKeys] = useState([]);
|
||||||
|
|
||||||
|
// 현재 경로에 따라 선택된 메뉴와 열린 서브메뉴 설정
|
||||||
|
useEffect(() => {
|
||||||
|
const path = location.pathname.split('/');
|
||||||
|
if (path.length > 1) {
|
||||||
|
// 첫 번째 경로(예: /usermanage)를 기반으로 openKeys 설정
|
||||||
|
setOpenKeys([path[1]]);
|
||||||
|
|
||||||
|
// 전체 경로(예: /usermanage/adminview)를 기반으로 selectedKeys 설정
|
||||||
|
if (path.length > 2) {
|
||||||
|
setSelectedKeys([`${path[1]}/${path[2]}`]);
|
||||||
|
} else {
|
||||||
|
setSelectedKeys([path[1]]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, [location.pathname]);
|
||||||
|
|
||||||
const handleToken = async () => {
|
const handleToken = async () => {
|
||||||
const tokenStatus = await AuthInfo(token);
|
const tokenStatus = await AuthInfo(token);
|
||||||
|
if (tokenStatus.message === '잘못된 타입의 토큰입니다.') {
|
||||||
tokenStatus.message === '잘못된 타입의 토큰입니다.' && setLogoutModalClose('view');
|
setLogoutModalClose('view');
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
handleToken();
|
handleToken();
|
||||||
}, [token]);
|
}, [token]);
|
||||||
|
|
||||||
const handleTopMenu = e => {
|
// 메뉴 아이템 클릭 핸들러
|
||||||
e.preventDefault();
|
const handleMenuClick = ({ key }) => {
|
||||||
e.target.classList.toggle('active');
|
handleToken();
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleLink = e => {
|
// 서브메뉴 열기/닫기 핸들러
|
||||||
let topActive = document.querySelectorAll('nav .active');
|
const handleOpenChange = (keys) => {
|
||||||
let currentTopMenu = e.target.closest('ul').previousSibling;
|
setOpenKeys(keys);
|
||||||
for (let i = 0; i < topActive.length; i++) {
|
|
||||||
if (topActive[i] !== currentTopMenu) {
|
|
||||||
topActive[i].classList.remove('active');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
handleToken();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// 등록 완료 모달
|
// 등록 완료 모달
|
||||||
const handleModalClose = () => {
|
const handleModalClose = () => {
|
||||||
if (modalClose === 'hidden') {
|
setModalClose(modalClose === 'hidden' ? 'view' : 'hidden');
|
||||||
setModalClose('view');
|
|
||||||
} else {
|
|
||||||
setModalClose('hidden');
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// 로그아웃 안내 모달
|
// 로그아웃 안내 모달
|
||||||
@@ -65,7 +72,6 @@ const Navi = () => {
|
|||||||
} else {
|
} else {
|
||||||
setLogoutModalClose('hidden');
|
setLogoutModalClose('hidden');
|
||||||
sessionStorage.removeItem('token');
|
sessionStorage.removeItem('token');
|
||||||
|
|
||||||
navigate('/');
|
navigate('/');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -79,41 +85,56 @@ const Navi = () => {
|
|||||||
default:
|
default:
|
||||||
return submenu.authLevel === adminAuthLevel.NONE && userInfo.auth_list && userInfo.auth_list.some(auth => auth.id === submenu.id);
|
return submenu.authLevel === adminAuthLevel.NONE && userInfo.auth_list && userInfo.auth_list.some(auth => auth.id === submenu.id);
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const getMenuItems = () => {
|
||||||
|
return menuConfig
|
||||||
|
.filter(item => item.access)
|
||||||
|
.map(item => ({
|
||||||
|
key: item.link.substring(1),
|
||||||
|
label: item.title,
|
||||||
|
children: item.submenu.map(submenu => ({
|
||||||
|
key: `${item.link.substring(1)}/${submenu.link.split('/').pop()}`,
|
||||||
|
label: (
|
||||||
|
<MenuItemLink
|
||||||
|
to={isClickable(submenu) ? submenu.link : location.pathname}
|
||||||
|
$isclickable={isClickable(submenu) ? 'true' : 'false'}
|
||||||
|
onClick={(e) => {
|
||||||
|
if (!isClickable(submenu)) {
|
||||||
|
e.preventDefault();
|
||||||
|
handleModalClose();
|
||||||
}
|
}
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
{submenu.title}
|
||||||
|
</MenuItemLink>
|
||||||
|
),
|
||||||
|
disabled: !isClickable(submenu)
|
||||||
|
}))
|
||||||
|
}));
|
||||||
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<nav>
|
<StyledNavWrapper>
|
||||||
<ul>
|
<ConfigProvider
|
||||||
{menu.map((item, idx) => {
|
theme={{
|
||||||
return (
|
algorithm: theme.darkAlgorithm,
|
||||||
<li key={idx}>
|
}}
|
||||||
{item.access && (
|
>
|
||||||
<TopMenu to={item.link} onClick={handleTopMenu}>
|
<StyledMenu
|
||||||
{item.title}
|
theme="dark"
|
||||||
</TopMenu>
|
mode="inline"
|
||||||
)}
|
openKeys={openKeys}
|
||||||
<SubMenu>
|
selectedKeys={selectedKeys}
|
||||||
{item.submenu && userInfo &&
|
onOpenChange={handleOpenChange}
|
||||||
item.submenu.map((submenu, idx) => {
|
onClick={handleMenuClick}
|
||||||
return (
|
items={getMenuItems()}
|
||||||
<SubMenuItem key={idx} $isclickable={isClickable(submenu) ? 'true' : 'false'}>
|
multiple={true}
|
||||||
<NavLink
|
/>
|
||||||
to={isClickable(submenu) ? submenu.link : location.pathname}
|
</ConfigProvider>
|
||||||
onClick={e => {
|
</StyledNavWrapper>
|
||||||
isClickable(submenu) ? handleLink(e) : handleModalClose();
|
|
||||||
}}>
|
|
||||||
{submenu.title}
|
|
||||||
</NavLink>
|
|
||||||
</SubMenuItem>
|
|
||||||
);
|
|
||||||
})}
|
|
||||||
</SubMenu>
|
|
||||||
</li>
|
|
||||||
);
|
|
||||||
})}
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
{/* 접근 불가 모달 */}
|
{/* 접근 불가 모달 */}
|
||||||
<Modal min="440px" $padding="40px" $bgcolor="transparent" $view={modalClose}>
|
<Modal min="440px" $padding="40px" $bgcolor="transparent" $view={modalClose}>
|
||||||
<BtnWrapper $justify="flex-end">
|
<BtnWrapper $justify="flex-end">
|
||||||
@@ -145,61 +166,15 @@ const Navi = () => {
|
|||||||
|
|
||||||
export default Navi;
|
export default Navi;
|
||||||
|
|
||||||
const TopMenu = styled(NavLink)`
|
const StyledNavWrapper = styled.div`
|
||||||
padding: 16px 30px;
|
|
||||||
width: 100%;
|
|
||||||
text-align: left;
|
|
||||||
border-bottom: 1px solid #888;
|
|
||||||
position: relative;
|
|
||||||
color: #fff;
|
|
||||||
|
|
||||||
&:before {
|
|
||||||
content: '';
|
|
||||||
display: block;
|
|
||||||
width: 12px;
|
|
||||||
height: 12px;
|
|
||||||
position: absolute;
|
|
||||||
right: 30px;
|
|
||||||
top: 50%;
|
|
||||||
transform: translate(0, -50%);
|
|
||||||
background: url('${arrowIcon}') -12px 0 no-repeat;
|
|
||||||
}
|
|
||||||
&:hover,
|
|
||||||
&.active {
|
|
||||||
background: #444;
|
|
||||||
}
|
|
||||||
&.active ~ ul {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
&.active:before {
|
|
||||||
background: url('${arrowIcon}') 0 0 no-repeat;
|
|
||||||
}
|
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const SubMenu = styled.ul`
|
const StyledMenu = styled(Menu)`
|
||||||
display: none;
|
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const SubMenuItem = styled.li`
|
const MenuItemLink = styled(NavLink)`
|
||||||
background: #eee;
|
|
||||||
border-bottom: 1px solid #ccc;
|
|
||||||
color: #2c2c2c;
|
|
||||||
a {
|
|
||||||
width: 100%;
|
|
||||||
padding: 16px 30px;
|
|
||||||
color: ${props => (props.$isclickable === 'false' ? '#818181' : '#2c2c2c')};
|
|
||||||
text-align: left;
|
|
||||||
&:hover,
|
|
||||||
&.active {
|
&.active {
|
||||||
color: ${props => (props.$isclickable === 'false' ? '#818181' : '#2c2c2c')};
|
|
||||||
font-weight: ${props => (props.$isclickable === 'false' ? 400 : 600)};
|
font-weight: ${props => (props.$isclickable === 'false' ? 400 : 600)};
|
||||||
}
|
}
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
const BackGround = styled.div`
|
|
||||||
background: #eee2;
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
z-index: 100;
|
|
||||||
`;
|
`;
|
||||||
@@ -1,20 +1,24 @@
|
|||||||
import { useState, useEffect } from 'react';
|
import { useState, useEffect } from 'react';
|
||||||
import UserIcon from '../../../assets/img/icon/icon-profile.png';
|
import { Layout, Avatar, Button as AntButton, Typography, Tooltip, Breadcrumb } from 'antd';
|
||||||
|
import { UserOutlined, LogoutOutlined, HomeOutlined } from '@ant-design/icons'
|
||||||
|
|
||||||
import styled from 'styled-components';
|
import styled from 'styled-components';
|
||||||
import Modal from '../modal/Modal';
|
|
||||||
import CloseIcon from '../../../assets/img/icon/icon-close.png';
|
|
||||||
import Button from '../../common/button/Button';
|
|
||||||
|
|
||||||
import { useRecoilState } from 'recoil';
|
import { useRecoilState } from 'recoil';
|
||||||
import { Link, useNavigate } from 'react-router-dom';
|
import { Link, useNavigate, useLocation } from 'react-router-dom';
|
||||||
import { AuthLogout, AuthInfo } from '../../../apis';
|
import { AuthLogout, AuthInfo } from '../../../apis';
|
||||||
import { BtnWrapper, ModalText } from '../../../styles/Components';
|
|
||||||
import { authList } from '../../../store/authList';
|
import { authList } from '../../../store/authList';
|
||||||
|
import { alertTypes } from '../../../assets/data/types';
|
||||||
|
import { useAlert } from '../../../context/AlertProvider';
|
||||||
|
import { menuConfig } from '../../../assets/data/menuConfig';
|
||||||
|
|
||||||
|
const { Header } = Layout;
|
||||||
|
const { Text } = Typography;
|
||||||
|
|
||||||
const Profile = () => {
|
const Profile = () => {
|
||||||
|
const location = useLocation();
|
||||||
|
const { showModal } = useAlert();
|
||||||
const [infoData, setInfoData] = useRecoilState(authList);
|
const [infoData, setInfoData] = useRecoilState(authList);
|
||||||
const [errorModal, setErrorModal] = useState('hidden');
|
|
||||||
|
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
@@ -40,91 +44,124 @@ const Profile = () => {
|
|||||||
|
|
||||||
// 필수값 입력 모달창
|
// 필수값 입력 모달창
|
||||||
const handleErrorModal = () => {
|
const handleErrorModal = () => {
|
||||||
if (errorModal === 'hidden') {
|
showModal('USER_LOGOUT_CONFIRM', {
|
||||||
setErrorModal('view');
|
type: alertTypes.confirm,
|
||||||
} else {
|
onConfirm: () => handleLogout()
|
||||||
setErrorModal('hidden');
|
});
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 카테고리별 첫 번째 아이템 링크 찾기
|
||||||
|
const getFirstItemLink = (categoryKey) => {
|
||||||
|
const category = menuConfig[categoryKey];
|
||||||
|
if (!category || !category.items) return `/${categoryKey}`;
|
||||||
|
|
||||||
|
// 첫 번째 visible 아이템 찾기
|
||||||
|
const firstVisibleItem = Object.entries(category.items)
|
||||||
|
.find(([_, item]) => item.view !== false);
|
||||||
|
|
||||||
|
if (!firstVisibleItem) return `/${categoryKey}`;
|
||||||
|
return `/${categoryKey}/${firstVisibleItem[0]}`;
|
||||||
|
};
|
||||||
|
|
||||||
|
const pathSnippets = location.pathname.split('/').filter(i => i);
|
||||||
|
|
||||||
|
const breadcrumbItems = [
|
||||||
|
{
|
||||||
|
title: <Link to="/"><HomeOutlined /></Link>,
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
|
if (pathSnippets.length > 0) {
|
||||||
|
// 첫 번째 경로 (메인 카테고리)
|
||||||
|
const mainCategory = pathSnippets[0];
|
||||||
|
if (menuConfig[mainCategory]) {
|
||||||
|
const firstItemLink = getFirstItemLink(mainCategory);
|
||||||
|
|
||||||
|
breadcrumbItems.push({
|
||||||
|
title: <Link to={firstItemLink}>{menuConfig[mainCategory].title}</Link>
|
||||||
|
});
|
||||||
|
|
||||||
|
// 두 번째 경로 (서브 카테고리)
|
||||||
|
if (pathSnippets.length > 1) {
|
||||||
|
const subCategory = pathSnippets[1];
|
||||||
|
if (menuConfig[mainCategory].items[subCategory]) {
|
||||||
|
breadcrumbItems.push({
|
||||||
|
title: menuConfig[mainCategory].items[subCategory].title
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<ProfileWrapper>
|
<StyledHeader>
|
||||||
<UserWrapper>{infoData.name && <Username>{infoData.name.length > 20 ? infoData.name.slice(0, 20) + '...' : infoData.name}님</Username>}</UserWrapper>
|
<StyledBreadcrumb items={breadcrumbItems} />
|
||||||
<Link>
|
<ProfileContainer>
|
||||||
<LogoutBtn onClick={handleErrorModal}>로그아웃</LogoutBtn>
|
<StyledAvatar
|
||||||
</Link>
|
size={32}
|
||||||
</ProfileWrapper>
|
icon={<UserOutlined />}
|
||||||
{/* 로그아웃 확인 모달 */}
|
/>
|
||||||
<Modal min="440px" $padding="40px" $bgcolor="transparent" $view={errorModal}>
|
{infoData.name &&
|
||||||
<BtnWrapper $justify="flex-end">
|
<StyledUsername>
|
||||||
<ButtonClose onClick={handleErrorModal} />
|
{infoData.name.length > 20 ? infoData.name.slice(0, 20) + '...' : infoData.name}님
|
||||||
</BtnWrapper>
|
</StyledUsername>
|
||||||
<ModalText $align="center">
|
}
|
||||||
로그아웃 하시겠습니까?
|
<Tooltip title="로그아웃">
|
||||||
<br />
|
<StyledLogoutButton
|
||||||
(로그아웃 시 저장되지 않은 값은 초기화 됩니다.)
|
type="text"
|
||||||
</ModalText>
|
icon={<LogoutOutlined />}
|
||||||
<BtnWrapper $gap="10px">
|
onClick={handleErrorModal}
|
||||||
<Button text="취소" theme="line" size="large" width="100%" handleClick={handleErrorModal} />
|
/>
|
||||||
<Button text="확인" theme="primary" type="submit" size="large" width="100%" handleClick={handleLogout} />
|
</Tooltip>
|
||||||
</BtnWrapper>
|
</ProfileContainer>
|
||||||
</Modal>
|
|
||||||
|
</StyledHeader>
|
||||||
|
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default Profile;
|
export default Profile;
|
||||||
|
|
||||||
const ProfileWrapper = styled.div`
|
const StyledHeader = styled(Header)`
|
||||||
background: #f6f6f6;
|
background: #f6f6f6;
|
||||||
padding: 20px;
|
padding: 0 20px;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-wrap: wrap;
|
justify-content: space-between;
|
||||||
gap: 30px;
|
|
||||||
word-break: break-all;
|
|
||||||
justify-content: flex-end;
|
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
height: 64px;
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const LogoutBtn = styled.button`
|
const StyledBreadcrumb = styled(Breadcrumb)`
|
||||||
color: #2c2c2c;
|
font-size: 15px;
|
||||||
line-height: 1;
|
font-weight: 600;
|
||||||
border-bottom: 0.5px solid #2c2c2c;
|
|
||||||
font-size: 13px;
|
|
||||||
font-weight: 300;
|
|
||||||
border-radius: 0;
|
|
||||||
letter-spacing: 0;
|
|
||||||
width: max-content;
|
|
||||||
height: max-content;
|
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const UserWrapper = styled.div`
|
const ProfileContainer = styled.div`
|
||||||
padding-left: 35px;
|
|
||||||
position: relative;
|
|
||||||
font-size: 18px;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 12px;
|
||||||
|
`;
|
||||||
|
|
||||||
&:before {
|
const StyledAvatar = styled(Avatar)`
|
||||||
background: url('${UserIcon}') 50% 50% no-repeat;
|
background-color: #1677ff;
|
||||||
width: 24px;
|
`;
|
||||||
height: 24px;
|
|
||||||
content: '';
|
const StyledUsername = styled(Text)`
|
||||||
display: block;
|
font-weight: 600;
|
||||||
position: absolute;
|
font-size: 18px;
|
||||||
left: 0;
|
color: rgba(0, 0, 0, 0.85);
|
||||||
top: 50%;
|
`;
|
||||||
transform: translate(0, -50%);
|
|
||||||
|
const StyledLogoutButton = styled(AntButton)`
|
||||||
|
color: rgba(0, 0, 0, 0.45);
|
||||||
|
transition: color 0.3s;
|
||||||
|
font-size: 18px;
|
||||||
|
|
||||||
|
&:hover {
|
||||||
|
color: #1677ff;
|
||||||
|
background: transparent;
|
||||||
}
|
}
|
||||||
`;
|
|
||||||
|
|
||||||
const Username = styled.div`
|
|
||||||
font-weight: 700;
|
|
||||||
padding-right: 3px;
|
|
||||||
`;
|
|
||||||
|
|
||||||
const ButtonClose = styled.button`
|
|
||||||
width: 16px;
|
|
||||||
height: 16px;
|
|
||||||
background: url(${CloseIcon}) 50% 50% no-repeat;
|
|
||||||
`;
|
`;
|
||||||
|
|||||||
41
src/components/common/Layout/AnimatedPageWrapper.js
Normal file
41
src/components/common/Layout/AnimatedPageWrapper.js
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
import React from 'react';
|
||||||
|
import { motion } from 'framer-motion';
|
||||||
|
|
||||||
|
const pageVariants = {
|
||||||
|
initial: {
|
||||||
|
opacity: 0,
|
||||||
|
x: 20
|
||||||
|
},
|
||||||
|
animate: {
|
||||||
|
opacity: 1,
|
||||||
|
x: 0,
|
||||||
|
transition: {
|
||||||
|
duration: 0.3,
|
||||||
|
ease: "easeInOut"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
exit: {
|
||||||
|
opacity: 0,
|
||||||
|
x: -20,
|
||||||
|
transition: {
|
||||||
|
duration: 0.2,
|
||||||
|
ease: "easeInOut"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const AnimatedPageWrapper = ({ children }) => {
|
||||||
|
return (
|
||||||
|
<motion.div
|
||||||
|
initial="initial"
|
||||||
|
animate="animate"
|
||||||
|
exit="exit"
|
||||||
|
variants={pageVariants}
|
||||||
|
style={{ width: '100%', height: '100%' }}
|
||||||
|
>
|
||||||
|
{children}
|
||||||
|
</motion.div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default AnimatedPageWrapper;
|
||||||
@@ -1,5 +1,8 @@
|
|||||||
import Layout from './Layout';
|
import Layout from './Layout';
|
||||||
import LoginLayout from './LoginLayout';
|
import LoginLayout from './LoginLayout';
|
||||||
import MainLayout from './MainLayout';
|
import MainLayout from './MainLayout';
|
||||||
|
import AnimatedPageWrapper from './AnimatedPageWrapper';
|
||||||
|
import DetailGrid from './DetailGrid';
|
||||||
|
import DetailLayout from './DetailLayout';
|
||||||
|
|
||||||
export { Layout, LoginLayout, MainLayout };
|
export { Layout, LoginLayout, MainLayout, AnimatedPageWrapper, DetailGrid, DetailLayout };
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ const resources = {
|
|||||||
ko: {
|
ko: {
|
||||||
translation: {
|
translation: {
|
||||||
//메시지
|
//메시지
|
||||||
|
USER_LOGOUT_CONFIRM: '로그아웃 하시겠습니까?\n(로그아웃 시 저장되지 않은 값은 초기화 됩니다.)',
|
||||||
NULL_MSG: '필수값을 입력해주세요.',
|
NULL_MSG: '필수값을 입력해주세요.',
|
||||||
DATE_KTC: '* UTC+9 한국시간 기준으로 설정 (UTC+0 자동 반영처리)',
|
DATE_KTC: '* UTC+9 한국시간 기준으로 설정 (UTC+0 자동 반영처리)',
|
||||||
NOT_ITEM: '존재하지 않는 아이템코드입니다.',
|
NOT_ITEM: '존재하지 않는 아이템코드입니다.',
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import React, { Fragment, useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
import React, { Fragment, useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
||||||
|
|
||||||
|
import { AnimatedPageWrapper } from '../../components/common/Layout'
|
||||||
import {
|
import {
|
||||||
Title,
|
Title,
|
||||||
TableStyle,
|
TableStyle,
|
||||||
@@ -174,7 +175,7 @@ const BusinessLogView = () => {
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<AnimatedPageWrapper>
|
||||||
<Title>비즈니스 로그 조회</Title>
|
<Title>비즈니스 로그 조회</Title>
|
||||||
<FormWrapper>
|
<FormWrapper>
|
||||||
<BusinessLogSearchBar
|
<BusinessLogSearchBar
|
||||||
@@ -271,7 +272,7 @@ const BusinessLogView = () => {
|
|||||||
<TopButton />
|
<TopButton />
|
||||||
</>
|
</>
|
||||||
}
|
}
|
||||||
</>
|
</AnimatedPageWrapper>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,128 +0,0 @@
|
|||||||
import { styled } from 'styled-components';
|
|
||||||
import { Link } from 'react-router-dom';
|
|
||||||
import { Fragment, useState } from 'react';
|
|
||||||
|
|
||||||
import { Title, TableStyle, BtnWrapper, ButtonClose, ModalText } from '../../styles/Components';
|
|
||||||
|
|
||||||
import LandSearchBar from '../../components/searchBar/LandSearchBar';
|
|
||||||
import Button from '../../components/common/button/Button';
|
|
||||||
import QuestDetailModal from '../../components/DataManage/QuestDetailModal';
|
|
||||||
import LandDetailModal from '../../components/DataManage/LandDetailModal';
|
|
||||||
import Modal from '../../components/common/modal/Modal';
|
|
||||||
|
|
||||||
import { useNavigate } from 'react-router-dom';
|
|
||||||
import { authList } from '../../store/authList';
|
|
||||||
import { useRecoilValue } from 'recoil';
|
|
||||||
|
|
||||||
const ContentsView = () => {
|
|
||||||
const navigate = useNavigate();
|
|
||||||
const userInfo = useRecoilValue(authList);
|
|
||||||
|
|
||||||
const [detailPop, setDetailPop] = useState('hidden');
|
|
||||||
const mokupData = [
|
|
||||||
{
|
|
||||||
landId: '2000515223',
|
|
||||||
ownerNick: '칼리버스F',
|
|
||||||
ownerId: '23d59e868ca342198f6a653d957914a5',
|
|
||||||
lockInDate: '2023-08-11 15:32:07',
|
|
||||||
landUrl: '0x5765eB84ab55369f430DdA0d0C2b443FB9372DB3',
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
const handleClick = () => {
|
|
||||||
if (detailPop === 'hidden') setDetailPop('view');
|
|
||||||
else setDetailPop('hidden');
|
|
||||||
};
|
|
||||||
return (
|
|
||||||
<>
|
|
||||||
{userInfo.auth_list && !userInfo.auth_list.some(auth => auth.id === 13) ? (
|
|
||||||
<Modal min="440px" $padding="40px" $bgcolor="transparent" $view={'view'}>
|
|
||||||
<BtnWrapper $justify="flex-end">
|
|
||||||
<ButtonClose onClick={() => navigate(-1)} />
|
|
||||||
</BtnWrapper>
|
|
||||||
<ModalText $align="center">
|
|
||||||
해당 메뉴에 대한 조회 권한이 없습니다.
|
|
||||||
<br />
|
|
||||||
권한 등급을 변경 후 다시 이용해주세요.
|
|
||||||
</ModalText>
|
|
||||||
<BtnWrapper $gap="10px">
|
|
||||||
<Button text="확인" theme="primary" type="submit" size="large" width="100%" handleClick={() => navigate(-1)} />
|
|
||||||
</BtnWrapper>
|
|
||||||
</Modal>
|
|
||||||
) : (
|
|
||||||
<>
|
|
||||||
<Title>랜드 정보 조회</Title>
|
|
||||||
<LandSearchBar />
|
|
||||||
<TableWrapper>
|
|
||||||
<TableStyle>
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th width="150">랜드 ID</th>
|
|
||||||
<th>소유자 아바타명</th>
|
|
||||||
<th>소유쟈 GUID</th>
|
|
||||||
<th width="200">Lock IN 처리 일자</th>
|
|
||||||
<th>랜드 URL</th>
|
|
||||||
<th width="150">상세보기</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{mokupData.map((data, index) => (
|
|
||||||
<Fragment key={index}>
|
|
||||||
<tr>
|
|
||||||
<td>{data.landId}</td>
|
|
||||||
<td>{data.ownerNick}</td>
|
|
||||||
<td>{data.ownerId}</td>
|
|
||||||
<td>{new Date(data.lockInDate).toLocaleString()}</td>
|
|
||||||
<td>
|
|
||||||
<LandLink to={data.landUrl}>{data.landUrl}</LandLink>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<Button theme="line" text="상세보기" handleClick={handleClick} />
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</Fragment>
|
|
||||||
))}
|
|
||||||
</tbody>
|
|
||||||
</TableStyle>
|
|
||||||
</TableWrapper>
|
|
||||||
<LandDetailModal detailPop={detailPop} handleClick={handleClick} />
|
|
||||||
</>
|
|
||||||
)}
|
|
||||||
</>
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
export default ContentsView;
|
|
||||||
|
|
||||||
const TableWrapper = styled.div`
|
|
||||||
overflow: auto;
|
|
||||||
border-top: 1px solid #000;
|
|
||||||
&::-webkit-scrollbar {
|
|
||||||
height: 4px;
|
|
||||||
}
|
|
||||||
&::-webkit-scrollbar-thumb {
|
|
||||||
background: #666666;
|
|
||||||
}
|
|
||||||
&::-webkit-scrollbar-track {
|
|
||||||
background: #d9d9d9;
|
|
||||||
}
|
|
||||||
thead {
|
|
||||||
th {
|
|
||||||
position: sticky;
|
|
||||||
top: 0;
|
|
||||||
z-index: 10;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
${TableStyle} {
|
|
||||||
min-width: 1000px;
|
|
||||||
th {
|
|
||||||
position: sticky;
|
|
||||||
top: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`;
|
|
||||||
|
|
||||||
const LandLink = styled(Link)`
|
|
||||||
color: #61a2d0;
|
|
||||||
text-decoration: underline;
|
|
||||||
`;
|
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import { Fragment, useEffect, useState } from 'react';
|
import { Fragment, useEffect, useState } from 'react';
|
||||||
|
|
||||||
|
import { AnimatedPageWrapper } from '../../components/common/Layout'
|
||||||
import Button from '../../components/common/button/Button';
|
import Button from '../../components/common/button/Button';
|
||||||
import Pagination from '../../components/common/Pagination/Pagination';
|
import Pagination from '../../components/common/Pagination/Pagination';
|
||||||
|
|
||||||
@@ -119,7 +120,7 @@ const GameLogView = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<AnimatedPageWrapper>
|
||||||
<Title>게임 로그 조회</Title>
|
<Title>게임 로그 조회</Title>
|
||||||
<TabScroll>
|
<TabScroll>
|
||||||
<TabWrapper>
|
<TabWrapper>
|
||||||
@@ -137,7 +138,7 @@ const GameLogView = () => {
|
|||||||
{/*{activeTab === 'ITEM' && <ItemLogContent />}*/}
|
{/*{activeTab === 'ITEM' && <ItemLogContent />}*/}
|
||||||
<CurrencyLogContent active={activeTab === 'CURRENCY'} />
|
<CurrencyLogContent active={activeTab === 'CURRENCY'} />
|
||||||
{/*{activeTab === 'TRADE' && <TradeLogContent />}*/}
|
{/*{activeTab === 'TRADE' && <TradeLogContent />}*/}
|
||||||
</>
|
</AnimatedPageWrapper>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { styled } from 'styled-components';
|
import { styled } from 'styled-components';
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
import React, { Fragment, useRef, useState } from 'react';
|
import React, { Fragment, useRef, useState } from 'react';
|
||||||
|
import { AnimatedPageWrapper } from '../../components/common/Layout'
|
||||||
|
|
||||||
import {
|
import {
|
||||||
Title,
|
Title,
|
||||||
@@ -158,7 +159,7 @@ const LandInfoView = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<AnimatedPageWrapper>
|
||||||
<Title>랜드 정보 조회</Title>
|
<Title>랜드 정보 조회</Title>
|
||||||
<FormWrapper>
|
<FormWrapper>
|
||||||
<LandInfoSearchBar
|
<LandInfoSearchBar
|
||||||
@@ -240,7 +241,7 @@ const LandInfoView = () => {
|
|||||||
content={detailData}
|
content={detailData}
|
||||||
setDetailData={setDetailData}
|
setDetailData={setDetailData}
|
||||||
/>
|
/>
|
||||||
</>
|
</AnimatedPageWrapper>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { useState, Fragment } from 'react';
|
import { useState, Fragment } from 'react';
|
||||||
|
|
||||||
import { TabScroll, Title } from '../../styles/Components';
|
import { TabScroll, Title } from '../../styles/Components';
|
||||||
|
import { AnimatedPageWrapper } from '../../components/common/Layout'
|
||||||
|
|
||||||
import styled from 'styled-components';
|
import styled from 'styled-components';
|
||||||
|
|
||||||
@@ -39,7 +40,7 @@ const UserView = () => {
|
|||||||
{userInfo.auth_list && !userInfo.auth_list.some(auth => auth.id === authType.userSearchRead) ? (
|
{userInfo.auth_list && !userInfo.auth_list.some(auth => auth.id === authType.userSearchRead) ? (
|
||||||
<AuthModal />
|
<AuthModal />
|
||||||
) : (
|
) : (
|
||||||
<>
|
<AnimatedPageWrapper>
|
||||||
<Title>유저조회</Title>
|
<Title>유저조회</Title>
|
||||||
<UserViewSearchBar setInfoView={setInfoView} resultData={resultData} handleTab={handleTab} setResultData={setResultData} />
|
<UserViewSearchBar setInfoView={setInfoView} resultData={resultData} handleTab={handleTab} setResultData={setResultData} />
|
||||||
<UserWrapper display={infoView}>
|
<UserWrapper display={infoView}>
|
||||||
@@ -68,7 +69,7 @@ const UserView = () => {
|
|||||||
{activeContent === '클레임' && <UserClaimInfo userInfo={resultData && resultData} />}
|
{activeContent === '클레임' && <UserClaimInfo userInfo={resultData && resultData} />}
|
||||||
</UserTabInfo>
|
</UserTabInfo>
|
||||||
</UserWrapper>
|
</UserWrapper>
|
||||||
</>
|
</AnimatedPageWrapper>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { useState } from 'react';
|
import { useState } from 'react';
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
|
import { AnimatedPageWrapper } from '../../components/common/Layout'
|
||||||
|
|
||||||
import Button from '../../components/common/button/Button';
|
import Button from '../../components/common/button/Button';
|
||||||
|
|
||||||
@@ -29,7 +30,7 @@ const EconomicIndex = () => {
|
|||||||
setActiveTab(content);
|
setActiveTab(content);
|
||||||
};
|
};
|
||||||
return (
|
return (
|
||||||
<>
|
<AnimatedPageWrapper>
|
||||||
<Title>경제 지표</Title>
|
<Title>경제 지표</Title>
|
||||||
<TabScroll>
|
<TabScroll>
|
||||||
<TabWrapper>
|
<TabWrapper>
|
||||||
@@ -49,7 +50,7 @@ const EconomicIndex = () => {
|
|||||||
{/*{activeTab === 'item' && <ItemContent />}*/}
|
{/*{activeTab === 'item' && <ItemContent />}*/}
|
||||||
{/*{activeTab === 'instance' && <InstanceContent />}*/}
|
{/*{activeTab === 'instance' && <InstanceContent />}*/}
|
||||||
{/*{activeTab === 'deco' && <DecoContent />}*/}
|
{/*{activeTab === 'deco' && <DecoContent />}*/}
|
||||||
</>
|
</AnimatedPageWrapper>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { Fragment, useEffect, useState } from 'react';
|
|||||||
import { styled } from 'styled-components';
|
import { styled } from 'styled-components';
|
||||||
import { Link, useNavigate } from 'react-router-dom';
|
import { Link, useNavigate } from 'react-router-dom';
|
||||||
import { useRecoilValue } from 'recoil';
|
import { useRecoilValue } from 'recoil';
|
||||||
|
import { AnimatedPageWrapper } from '../../components/common/Layout';
|
||||||
|
|
||||||
import Modal from '../../components/common/modal/Modal';
|
import Modal from '../../components/common/modal/Modal';
|
||||||
import Button from '../../components/common/button/Button';
|
import Button from '../../components/common/button/Button';
|
||||||
@@ -14,6 +15,7 @@ import { userIndexView, userTotalIndex } from '../../apis';
|
|||||||
import { UserContent, SegmentContent, PlayTimeContent, RetentionContent, DailyActiveUserContent, DailyMedalContent } from '../../components/IndexManage/index';
|
import { UserContent, SegmentContent, PlayTimeContent, RetentionContent, DailyActiveUserContent, DailyMedalContent } from '../../components/IndexManage/index';
|
||||||
import AuthModal from '../../components/common/modal/AuthModal';
|
import AuthModal from '../../components/common/modal/AuthModal';
|
||||||
import { authType } from '../../assets/data';
|
import { authType } from '../../assets/data';
|
||||||
|
import { withAuth } from '../../hooks/hook';
|
||||||
|
|
||||||
const UserIndex = () => {
|
const UserIndex = () => {
|
||||||
const token = sessionStorage.getItem('token');
|
const token = sessionStorage.getItem('token');
|
||||||
@@ -37,11 +39,7 @@ const UserIndex = () => {
|
|||||||
];
|
];
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<AnimatedPageWrapper>
|
||||||
{userInfo.auth_list && !userInfo.auth_list.some(auth => auth.id === authType.userIndicatorsRead) ? (
|
|
||||||
<AuthModal/>
|
|
||||||
) : (
|
|
||||||
<>
|
|
||||||
<Title>유저 지표</Title>
|
<Title>유저 지표</Title>
|
||||||
<TabWrapper>
|
<TabWrapper>
|
||||||
{TabList.map((el, idx) => {
|
{TabList.map((el, idx) => {
|
||||||
@@ -65,13 +63,11 @@ const UserIndex = () => {
|
|||||||
{/*{activeTab === '메달' && <DailyMedalContent />}*/}
|
{/*{activeTab === '메달' && <DailyMedalContent />}*/}
|
||||||
|
|
||||||
|
|
||||||
</>
|
</AnimatedPageWrapper>
|
||||||
)}
|
|
||||||
</>
|
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
export default UserIndex;
|
export default withAuth(authType.userIndicatorsRead)(UserIndex);
|
||||||
|
|
||||||
const TabItem = styled(Link)`
|
const TabItem = styled(Link)`
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ import { useLoading } from '../../context/LoadingProvider';
|
|||||||
import LogDetailModal from '../../components/common/modal/LogDetailModal';
|
import LogDetailModal from '../../components/common/modal/LogDetailModal';
|
||||||
import { historyTables } from '../../assets/data/data';
|
import { historyTables } from '../../assets/data/data';
|
||||||
import { LogHistory } from '../../apis';
|
import { LogHistory } from '../../apis';
|
||||||
|
import { AnimatedPageWrapper } from '../../components/common/Layout';
|
||||||
|
|
||||||
const BattleEvent = () => {
|
const BattleEvent = () => {
|
||||||
const token = sessionStorage.getItem('token');
|
const token = sessionStorage.getItem('token');
|
||||||
@@ -255,7 +256,7 @@ const BattleEvent = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<AnimatedPageWrapper>
|
||||||
<Title>전투시스템 타임 스케줄러</Title>
|
<Title>전투시스템 타임 스케줄러</Title>
|
||||||
<FormWrapper>
|
<FormWrapper>
|
||||||
<BattleEventSearchBar
|
<BattleEventSearchBar
|
||||||
@@ -381,7 +382,7 @@ const BattleEvent = () => {
|
|||||||
title="히스토리"
|
title="히스토리"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
</>
|
</AnimatedPageWrapper>
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ import { useLoading } from '../../context/LoadingProvider';
|
|||||||
import LogDetailModal from '../../components/common/modal/LogDetailModal';
|
import LogDetailModal from '../../components/common/modal/LogDetailModal';
|
||||||
import { historyTables } from '../../assets/data/data';
|
import { historyTables } from '../../assets/data/data';
|
||||||
import { LogHistory } from '../../apis';
|
import { LogHistory } from '../../apis';
|
||||||
|
import { AnimatedPageWrapper } from '../../components/common/Layout';
|
||||||
|
|
||||||
const Board = () => {
|
const Board = () => {
|
||||||
const token = sessionStorage.getItem('token');
|
const token = sessionStorage.getItem('token');
|
||||||
@@ -127,7 +128,7 @@ const Board = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<AnimatedPageWrapper>
|
||||||
<Title>인게임 메시지</Title>
|
<Title>인게임 메시지</Title>
|
||||||
<TableInfo>
|
<TableInfo>
|
||||||
<ListOption>
|
<ListOption>
|
||||||
@@ -217,7 +218,7 @@ const Board = () => {
|
|||||||
title="히스토리"
|
title="히스토리"
|
||||||
/>
|
/>
|
||||||
</TableWrapper>
|
</TableWrapper>
|
||||||
</>
|
</AnimatedPageWrapper>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ import { alertTypes } from '../../assets/data/types';
|
|||||||
import useCommonSearchOld from '../../hooks/useCommonSearchOld';
|
import useCommonSearchOld from '../../hooks/useCommonSearchOld';
|
||||||
import { historyTables } from '../../assets/data/data';
|
import { historyTables } from '../../assets/data/data';
|
||||||
import LogDetailModal from '../../components/common/modal/LogDetailModal';
|
import LogDetailModal from '../../components/common/modal/LogDetailModal';
|
||||||
|
import {AnimatedPageWrapper} from '../../components/common/Layout';
|
||||||
|
|
||||||
const Event = () => {
|
const Event = () => {
|
||||||
const token = sessionStorage.getItem('token');
|
const token = sessionStorage.getItem('token');
|
||||||
@@ -158,7 +159,7 @@ const Event = () => {
|
|||||||
{userInfo.auth_list && !userInfo.auth_list.some(auth => auth.id === authType.eventRead) ? (
|
{userInfo.auth_list && !userInfo.auth_list.some(auth => auth.id === authType.eventRead) ? (
|
||||||
<AuthModal />
|
<AuthModal />
|
||||||
) : (
|
) : (
|
||||||
<>
|
<AnimatedPageWrapper>
|
||||||
<Title>출석 보상 이벤트 관리</Title>
|
<Title>출석 보상 이벤트 관리</Title>
|
||||||
<FormWrapper>
|
<FormWrapper>
|
||||||
<CommonSearchBar
|
<CommonSearchBar
|
||||||
@@ -281,7 +282,7 @@ const Event = () => {
|
|||||||
<ModalSubText $color={deleteDesc.length > 29 ? 'red' : '#666'}>* 최대 등록 가능 글자수 ({deleteDesc.length}/30자)</ModalSubText>
|
<ModalSubText $color={deleteDesc.length > 29 ? 'red' : '#666'}>* 최대 등록 가능 글자수 ({deleteDesc.length}/30자)</ModalSubText>
|
||||||
</ModalInputItem>
|
</ModalInputItem>
|
||||||
</DynamicModal>
|
</DynamicModal>
|
||||||
</>
|
</AnimatedPageWrapper>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ import { timeDiffMinute } from '../../utils';
|
|||||||
import { useAlert } from '../../context/AlertProvider';
|
import { useAlert } from '../../context/AlertProvider';
|
||||||
import { alertTypes, currencyCodeTypes } from '../../assets/data/types';
|
import { alertTypes, currencyCodeTypes } from '../../assets/data/types';
|
||||||
import { useLoading } from '../../context/LoadingProvider';
|
import { useLoading } from '../../context/LoadingProvider';
|
||||||
|
import { AnimatedPageWrapper } from '../../components/common/Layout';
|
||||||
|
|
||||||
const EventRegist = () => {
|
const EventRegist = () => {
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
@@ -275,7 +276,7 @@ const EventRegist = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<AnimatedPageWrapper>
|
||||||
{userInfo.auth_list && !userInfo.auth_list.some(auth => auth.id === authType.eventUpdate) ? (
|
{userInfo.auth_list && !userInfo.auth_list.some(auth => auth.id === authType.eventUpdate) ? (
|
||||||
<AuthModal/>
|
<AuthModal/>
|
||||||
) : (
|
) : (
|
||||||
@@ -458,7 +459,7 @@ const EventRegist = () => {
|
|||||||
</BtnWrapper>
|
</BtnWrapper>
|
||||||
</>
|
</>
|
||||||
)}
|
)}
|
||||||
</>
|
</AnimatedPageWrapper>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import { useLoading } from '../../context/LoadingProvider';
|
|||||||
import useEnhancedCommonSearch from '../../hooks/useEnhancedCommonSearch';
|
import useEnhancedCommonSearch from '../../hooks/useEnhancedCommonSearch';
|
||||||
import CustomConfirmModal from '../../components/common/modal/CustomConfirmModal';
|
import CustomConfirmModal from '../../components/common/modal/CustomConfirmModal';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
import { AnimatedPageWrapper } from '../../components/common/Layout';
|
||||||
|
|
||||||
const Items = () => {
|
const Items = () => {
|
||||||
const token = sessionStorage.getItem('token');
|
const token = sessionStorage.getItem('token');
|
||||||
@@ -155,7 +156,7 @@ const Items = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<AnimatedPageWrapper>
|
||||||
<Title>아이템 관리</Title>
|
<Title>아이템 관리</Title>
|
||||||
<FormWrapper>
|
<FormWrapper>
|
||||||
<CommonSearchBar
|
<CommonSearchBar
|
||||||
@@ -199,7 +200,7 @@ const Items = () => {
|
|||||||
handleCancel={() => handleModalClose('delete')}
|
handleCancel={() => handleModalClose('delete')}
|
||||||
handleClose={() => handleModalClose('delete')}
|
handleClose={() => handleModalClose('delete')}
|
||||||
/>
|
/>
|
||||||
</>
|
</AnimatedPageWrapper>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ import { alertTypes } from '../../assets/data/types';
|
|||||||
import { useAlert } from '../../context/AlertProvider';
|
import { useAlert } from '../../context/AlertProvider';
|
||||||
import LogDetailModal from '../../components/common/modal/LogDetailModal';
|
import LogDetailModal from '../../components/common/modal/LogDetailModal';
|
||||||
import { historyTables } from '../../assets/data/data';
|
import { historyTables } from '../../assets/data/data';
|
||||||
|
import { AnimatedPageWrapper } from '../../components/common/Layout';
|
||||||
|
|
||||||
const LandAuction = () => {
|
const LandAuction = () => {
|
||||||
const token = sessionStorage.getItem('token');
|
const token = sessionStorage.getItem('token');
|
||||||
@@ -161,7 +162,7 @@ const LandAuction = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<AnimatedPageWrapper>
|
||||||
<Title>랜드 경매 관리</Title>
|
<Title>랜드 경매 관리</Title>
|
||||||
<FormWrapper>
|
<FormWrapper>
|
||||||
<LandAuctionSearchBar
|
<LandAuctionSearchBar
|
||||||
@@ -277,7 +278,7 @@ const LandAuction = () => {
|
|||||||
title="히스토리"
|
title="히스토리"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
</>
|
</AnimatedPageWrapper>
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ import { useLoading } from '../../context/LoadingProvider';
|
|||||||
import useCommonSearchOld from '../../hooks/useCommonSearchOld';
|
import useCommonSearchOld from '../../hooks/useCommonSearchOld';
|
||||||
import LogDetailModal from '../../components/common/modal/LogDetailModal';
|
import LogDetailModal from '../../components/common/modal/LogDetailModal';
|
||||||
import { historyTables } from '../../assets/data/data';
|
import { historyTables } from '../../assets/data/data';
|
||||||
|
import { AnimatedPageWrapper } from '../../components/common/Layout';
|
||||||
|
|
||||||
const Mail = () => {
|
const Mail = () => {
|
||||||
const token = sessionStorage.getItem('token');
|
const token = sessionStorage.getItem('token');
|
||||||
@@ -134,7 +135,7 @@ const Mail = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<AnimatedPageWrapper>
|
||||||
<Title>우편 조회 및 발송 관리</Title>
|
<Title>우편 조회 및 발송 관리</Title>
|
||||||
<FormWrapper>
|
<FormWrapper>
|
||||||
<CommonSearchBar
|
<CommonSearchBar
|
||||||
@@ -238,7 +239,7 @@ const Mail = () => {
|
|||||||
title="히스토리"
|
title="히스토리"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
</>
|
</AnimatedPageWrapper>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import {
|
|||||||
Textarea,
|
Textarea,
|
||||||
SearchBarAlert,
|
SearchBarAlert,
|
||||||
} from '../../styles/Components';
|
} from '../../styles/Components';
|
||||||
|
import { AnimatedPageWrapper } from '../../components/common/Layout'
|
||||||
|
|
||||||
import IconDelete from '../../assets/img/icon/icon-delete.png';
|
import IconDelete from '../../assets/img/icon/icon-delete.png';
|
||||||
import CloseIcon from '../../assets/img/icon/icon-close.png';
|
import CloseIcon from '../../assets/img/icon/icon-close.png';
|
||||||
@@ -351,7 +352,7 @@ const MailRegist = () => {
|
|||||||
{userInfo.auth_list && !userInfo.auth_list.some(auth => auth.id === authType.mailUpdate) ? (
|
{userInfo.auth_list && !userInfo.auth_list.some(auth => auth.id === authType.mailUpdate) ? (
|
||||||
<AuthModal />
|
<AuthModal />
|
||||||
) : (
|
) : (
|
||||||
<>
|
<AnimatedPageWrapper>
|
||||||
<Title>우편 등록</Title>
|
<Title>우편 등록</Title>
|
||||||
|
|
||||||
<RegistGroup>
|
<RegistGroup>
|
||||||
@@ -637,7 +638,7 @@ const MailRegist = () => {
|
|||||||
handleClick={() => handleSubmit('submit')}
|
handleClick={() => handleSubmit('submit')}
|
||||||
/>
|
/>
|
||||||
</BtnWrapper>
|
</BtnWrapper>
|
||||||
</>
|
</AnimatedPageWrapper>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import useEnhancedCommonSearch from '../../hooks/useEnhancedCommonSearch';
|
|||||||
import MenuBannerDetailModal from '../../components/modal/MenuBannerDetailModal';
|
import MenuBannerDetailModal from '../../components/modal/MenuBannerDetailModal';
|
||||||
import { historyTables } from '../../assets/data/data';
|
import { historyTables } from '../../assets/data/data';
|
||||||
import LogDetailModal from '../../components/common/modal/LogDetailModal';
|
import LogDetailModal from '../../components/common/modal/LogDetailModal';
|
||||||
|
import { AnimatedPageWrapper } from '../../components/common/Layout';
|
||||||
|
|
||||||
const MenuBanner = () => {
|
const MenuBanner = () => {
|
||||||
const tableRef = useRef(null);
|
const tableRef = useRef(null);
|
||||||
@@ -121,7 +122,7 @@ const MenuBanner = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<AnimatedPageWrapper>
|
||||||
<Title>메뉴 배너 관리</Title>
|
<Title>메뉴 배너 관리</Title>
|
||||||
|
|
||||||
{/* 조회조건 */}
|
{/* 조회조건 */}
|
||||||
@@ -192,7 +193,7 @@ const MenuBanner = () => {
|
|||||||
title="히스토리"
|
title="히스토리"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
</>
|
</AnimatedPageWrapper>
|
||||||
)
|
)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import {
|
|||||||
BtnWrapper,
|
BtnWrapper,
|
||||||
SearchBarAlert,
|
SearchBarAlert,
|
||||||
} from '../../styles/Components';
|
} from '../../styles/Components';
|
||||||
|
import { AnimatedPageWrapper } from '../../components/common/Layout';
|
||||||
|
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
import { MenuBannerSingleRegist } from '../../apis';
|
import { MenuBannerSingleRegist } from '../../apis';
|
||||||
@@ -258,7 +259,7 @@ const MenuBannerRegist = () => {
|
|||||||
{userInfo.auth_list && !userInfo.auth_list.some(auth => auth.id === authType.eventUpdate) ? (
|
{userInfo.auth_list && !userInfo.auth_list.some(auth => auth.id === authType.eventUpdate) ? (
|
||||||
<AuthModal/>
|
<AuthModal/>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<AnimatedPageWrapper>
|
||||||
<Title>메뉴배너 등록</Title>
|
<Title>메뉴배너 등록</Title>
|
||||||
<RegistGroup>
|
<RegistGroup>
|
||||||
<FormRowGroup>
|
<FormRowGroup>
|
||||||
@@ -365,7 +366,7 @@ const MenuBannerRegist = () => {
|
|||||||
})}
|
})}
|
||||||
/>
|
/>
|
||||||
</BtnWrapper>
|
</BtnWrapper>
|
||||||
</>
|
</AnimatedPageWrapper>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
import { Fragment, useEffect, useState } from 'react';
|
import { Fragment, useEffect, useState } from 'react';
|
||||||
|
import styled from 'styled-components';
|
||||||
|
import { AnimatedPageWrapper } from '../../components/common/Layout';
|
||||||
|
|
||||||
import CheckBox from '../../components/common/input/CheckBox';
|
import CheckBox from '../../components/common/input/CheckBox';
|
||||||
|
|
||||||
import styled from 'styled-components';
|
|
||||||
import { Title, FormWrapper, TableInfo, ListCount, ListOption, TableStyle, SelectInput, TableWrapper, ButtonClose, ModalText, BtnWrapper } from '../../styles/Components';
|
import { Title, FormWrapper, TableInfo, ListCount, ListOption, TableStyle, SelectInput, TableWrapper, ButtonClose, ModalText, BtnWrapper } from '../../styles/Components';
|
||||||
import Button from '../../components/common/button/Button';
|
import Button from '../../components/common/button/Button';
|
||||||
|
|
||||||
@@ -242,7 +243,7 @@ const ReportList = () => {
|
|||||||
{userInfo.auth_list && !userInfo.auth_list.some(auth => auth.id === authType.reportRead) ? (
|
{userInfo.auth_list && !userInfo.auth_list.some(auth => auth.id === authType.reportRead) ? (
|
||||||
<AuthModal/>
|
<AuthModal/>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<AnimatedPageWrapper>
|
||||||
<Title>신고내역 조회 및 답변</Title>
|
<Title>신고내역 조회 및 답변</Title>
|
||||||
<ReportListSummary />
|
<ReportListSummary />
|
||||||
<FormWrapper>
|
<FormWrapper>
|
||||||
@@ -331,7 +332,7 @@ const ReportList = () => {
|
|||||||
<Button text="확인" theme="primary" type="submit" size="large" width="100%" handleClick={handleConfirmeModalClose} />
|
<Button text="확인" theme="primary" type="submit" size="large" width="100%" handleClick={handleConfirmeModalClose} />
|
||||||
</BtnWrapper>
|
</BtnWrapper>
|
||||||
</Modal>
|
</Modal>
|
||||||
</>
|
</AnimatedPageWrapper>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import React, { useState, Fragment } from 'react';
|
import React, { useState, Fragment } from 'react';
|
||||||
import { Title, FormWrapper, TextInput } from '../../styles/Components';
|
import { Title, FormWrapper, TextInput } from '../../styles/Components';
|
||||||
import { useNavigate } from 'react-router-dom';
|
import { useNavigate } from 'react-router-dom';
|
||||||
|
import { AnimatedPageWrapper } from '../../components/common/Layout';
|
||||||
import {
|
import {
|
||||||
CommonSearchBar,
|
CommonSearchBar,
|
||||||
UserBlockDetailModal,
|
UserBlockDetailModal,
|
||||||
@@ -130,7 +131,7 @@ const UserBlock = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<AnimatedPageWrapper>
|
||||||
<Title>이용자 제재 조회 및 등록</Title>
|
<Title>이용자 제재 조회 및 등록</Title>
|
||||||
<FormWrapper>
|
<FormWrapper>
|
||||||
<CommonSearchBar
|
<CommonSearchBar
|
||||||
@@ -209,7 +210,7 @@ const UserBlock = () => {
|
|||||||
<ModalSubText $color={deleteDesc.length > 29 ? 'red' : '#666'}>* 최대 등록 가능 글자수 ({deleteDesc.length}/30자)</ModalSubText>
|
<ModalSubText $color={deleteDesc.length > 29 ? 'red' : '#666'}>* 최대 등록 가능 글자수 ({deleteDesc.length}/30자)</ModalSubText>
|
||||||
</ModalInputItem>
|
</ModalInputItem>
|
||||||
</DynamicModal>
|
</DynamicModal>
|
||||||
</>
|
</AnimatedPageWrapper>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
import React, { useState, useEffect, useRef } from 'react';
|
import React, { useState, useEffect, useRef } from 'react';
|
||||||
|
|
||||||
|
import {AnimatedPageWrapper} from '../../components/common/Layout'
|
||||||
|
|
||||||
import Button from '../../components/common/button/Button';
|
import Button from '../../components/common/button/Button';
|
||||||
import RadioInput from '../../components/common/input/Radio';
|
import RadioInput from '../../components/common/input/Radio';
|
||||||
|
|
||||||
@@ -267,7 +269,7 @@ const UserBlockRegist = () => {
|
|||||||
{userInfo.auth_list && !userInfo.auth_list.some(auth => auth.id === authType.blackListUpdate) ? (
|
{userInfo.auth_list && !userInfo.auth_list.some(auth => auth.id === authType.blackListUpdate) ? (
|
||||||
<AuthModal/>
|
<AuthModal/>
|
||||||
) : (
|
) : (
|
||||||
<>
|
<AnimatedPageWrapper>
|
||||||
<Title>이용자 제재 등록</Title>
|
<Title>이용자 제재 등록</Title>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
@@ -563,7 +565,7 @@ const UserBlockRegist = () => {
|
|||||||
/>
|
/>
|
||||||
</BtnWrapper>
|
</BtnWrapper>
|
||||||
</BtnWrapper>
|
</BtnWrapper>
|
||||||
</>
|
</AnimatedPageWrapper>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { Fragment, useEffect, useState } from 'react';
|
import { Fragment, useEffect, useState } from 'react';
|
||||||
|
|
||||||
|
import { AnimatedPageWrapper } from '../../components/common/Layout'
|
||||||
import CheckBox from '../../components/common/input/CheckBox';
|
import CheckBox from '../../components/common/input/CheckBox';
|
||||||
import { Title, FormWrapper, SelectInput, BtnWrapper, TableInfo, ListCount, ListOption, TableStyle, State, ButtonClose, ModalText } from '../../styles/Components';
|
import { Title, FormWrapper, SelectInput, BtnWrapper, TableInfo, ListCount, ListOption, TableStyle, State, ButtonClose, ModalText } from '../../styles/Components';
|
||||||
import Button from '../../components/common/button/Button';
|
import Button from '../../components/common/button/Button';
|
||||||
@@ -292,7 +293,7 @@ function AdminView() {
|
|||||||
{userInfo.auth_list && !userInfo.auth_list.some(auth => auth.id === 1) ? (
|
{userInfo.auth_list && !userInfo.auth_list.some(auth => auth.id === 1) ? (
|
||||||
<AuthModal />
|
<AuthModal />
|
||||||
) : (
|
) : (
|
||||||
<>
|
<AnimatedPageWrapper>
|
||||||
<Title>운영자 조회</Title>
|
<Title>운영자 조회</Title>
|
||||||
<FormWrapper action="" $flow="row">
|
<FormWrapper action="" $flow="row">
|
||||||
<AdminViewSearchBar handleSearch={handleSearch} groupList={groupList} setResultData={setSearchData} setCurrentPage={setCurrentPage} />
|
<AdminViewSearchBar handleSearch={handleSearch} groupList={groupList} setResultData={setSearchData} setCurrentPage={setCurrentPage} />
|
||||||
@@ -492,7 +493,7 @@ function AdminView() {
|
|||||||
<Button text="확인" theme="primary" type="submit" size="large" width="100%" handleClick={handlePasswordInitialize} />
|
<Button text="확인" theme="primary" type="submit" size="large" width="100%" handleClick={handlePasswordInitialize} />
|
||||||
</BtnWrapper>
|
</BtnWrapper>
|
||||||
</Modal>
|
</Modal>
|
||||||
</>
|
</AnimatedPageWrapper>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import CheckBox from '../../components/common/input/CheckBox';
|
import CheckBox from '../../components/common/input/CheckBox';
|
||||||
|
|
||||||
|
import { AnimatedPageWrapper } from '../../components/common/Layout'
|
||||||
import Modal from '../../components/common/modal/Modal';
|
import Modal from '../../components/common/modal/Modal';
|
||||||
import { Title, FormWrapper, SelectInput, TableInfo, ListCount, ListOption, TableStyle, BtnWrapper, ButtonClose, ModalText } from '../../styles/Components';
|
import { Title, FormWrapper, SelectInput, TableInfo, ListCount, ListOption, TableStyle, BtnWrapper, ButtonClose, ModalText } from '../../styles/Components';
|
||||||
import Button from '../../components/common/button/Button';
|
import Button from '../../components/common/button/Button';
|
||||||
@@ -168,7 +169,7 @@ const AuthSetting = () => {
|
|||||||
{userInfo.auth_list && !userInfo.auth_list.some(auth => auth.id === authType.authoritySettingRead) ? (
|
{userInfo.auth_list && !userInfo.auth_list.some(auth => auth.id === authType.authoritySettingRead) ? (
|
||||||
<AuthModal />
|
<AuthModal />
|
||||||
) : (
|
) : (
|
||||||
<>
|
<AnimatedPageWrapper>
|
||||||
<Title>권한 설정</Title>
|
<Title>권한 설정</Title>
|
||||||
{userInfo.auth_list && userInfo.auth_list.some(auth => auth.id === authType.authoritySettingUpdate) && (
|
{userInfo.auth_list && userInfo.auth_list.some(auth => auth.id === authType.authoritySettingUpdate) && (
|
||||||
<FormWrapper action="" $flow="row">
|
<FormWrapper action="" $flow="row">
|
||||||
@@ -270,7 +271,7 @@ const AuthSetting = () => {
|
|||||||
/>
|
/>
|
||||||
</BtnWrapper>
|
</BtnWrapper>
|
||||||
</Modal>
|
</Modal>
|
||||||
</>
|
</AnimatedPageWrapper>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { useLocation, useNavigate } from 'react-router-dom';
|
|||||||
import { useCallback, useEffect, useMemo, useState } from 'react';
|
import { useCallback, useEffect, useMemo, useState } from 'react';
|
||||||
import { useRecoilValue } from 'recoil';
|
import { useRecoilValue } from 'recoil';
|
||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
|
import { AnimatedPageWrapper } from '../../components/common/Layout';
|
||||||
|
|
||||||
import { authList } from '../../store/authList';
|
import { authList } from '../../store/authList';
|
||||||
import { authType, modalTypes } from '../../assets/data';
|
import { authType, modalTypes } from '../../assets/data';
|
||||||
@@ -100,7 +101,7 @@ const AuthSettingUpdate = () => {
|
|||||||
{userInfo.auth_list && !userInfo.auth_list.some(auth => auth.id === authType.authoritySettingUpdate) ? (
|
{userInfo.auth_list && !userInfo.auth_list.some(auth => auth.id === authType.authoritySettingUpdate) ? (
|
||||||
<AuthModal />
|
<AuthModal />
|
||||||
) : (
|
) : (
|
||||||
<>
|
<AnimatedPageWrapper>
|
||||||
<Title>권한 설정</Title>
|
<Title>권한 설정</Title>
|
||||||
<FormWrapper $flow="column">
|
<FormWrapper $flow="column">
|
||||||
<TableStyle>
|
<TableStyle>
|
||||||
@@ -148,7 +149,7 @@ const AuthSettingUpdate = () => {
|
|||||||
</BtnWrapper>
|
</BtnWrapper>
|
||||||
</FormWrapper>
|
</FormWrapper>
|
||||||
|
|
||||||
</>
|
</AnimatedPageWrapper>
|
||||||
)}
|
)}
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import { useRecoilValue } from 'recoil';
|
|||||||
import { useTranslation } from 'react-i18next';
|
import { useTranslation } from 'react-i18next';
|
||||||
import 'react-datepicker/dist/react-datepicker.css';
|
import 'react-datepicker/dist/react-datepicker.css';
|
||||||
|
|
||||||
|
import { AnimatedPageWrapper } from '../../components/common/Layout'
|
||||||
import { authList } from '../../store/authList';
|
import { authList } from '../../store/authList';
|
||||||
import {
|
import {
|
||||||
authType,
|
authType,
|
||||||
@@ -136,7 +137,7 @@ const CaliumRequest = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<AnimatedPageWrapper>
|
||||||
<Title>칼리움 사용 수량 요청</Title>
|
<Title>칼리움 사용 수량 요청</Title>
|
||||||
<FormWrapper>
|
<FormWrapper>
|
||||||
<CommonSearchBar
|
<CommonSearchBar
|
||||||
@@ -250,7 +251,7 @@ const CaliumRequest = () => {
|
|||||||
title="히스토리"
|
title="히스토리"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
</>
|
</AnimatedPageWrapper>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import React, { useState, Fragment, useMemo } from 'react';
|
import React, { useState, Fragment, useMemo } from 'react';
|
||||||
import Button from '../../components/common/button/Button';
|
import Button from '../../components/common/button/Button';
|
||||||
import Loading from '../../components/common/Loading';
|
import Loading from '../../components/common/Loading';
|
||||||
|
import { AnimatedPageWrapper } from '../../components/common/Layout'
|
||||||
|
|
||||||
import {
|
import {
|
||||||
Title,
|
Title,
|
||||||
@@ -139,7 +140,7 @@ const DataInitView = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<AnimatedPageWrapper>
|
||||||
<Title>데이터 초기화</Title>
|
<Title>데이터 초기화</Title>
|
||||||
<MessageWrapper>
|
<MessageWrapper>
|
||||||
<FormRowGroup>
|
<FormRowGroup>
|
||||||
@@ -227,7 +228,7 @@ const DataInitView = () => {
|
|||||||
handleCancel={() => handleModalClose('registConfirm')}
|
handleCancel={() => handleModalClose('registConfirm')}
|
||||||
/>
|
/>
|
||||||
<TopButton />
|
<TopButton />
|
||||||
</>
|
</AnimatedPageWrapper>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import React, { Fragment, useCallback, useState } from 'react';
|
import React, { Fragment, useCallback, useState } from 'react';
|
||||||
|
|
||||||
|
import { AnimatedPageWrapper } from '../../components/common/Layout'
|
||||||
import { CommonSearchBar } from '../../components/ServiceManage';
|
import { CommonSearchBar } from '../../components/ServiceManage';
|
||||||
import { Title, FormWrapper } from '../../styles/Components';
|
import { Title, FormWrapper } from '../../styles/Components';
|
||||||
import { authType } from '../../assets/data';
|
import { authType } from '../../assets/data';
|
||||||
@@ -51,7 +52,7 @@ const LogView = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<AnimatedPageWrapper>
|
||||||
<Title>사용 이력 조회</Title>
|
<Title>사용 이력 조회</Title>
|
||||||
|
|
||||||
{/* 조회조건 */}
|
{/* 조회조건 */}
|
||||||
@@ -99,7 +100,7 @@ const LogView = () => {
|
|||||||
title="상세정보"
|
title="상세정보"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
</>
|
</AnimatedPageWrapper>
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ export const Container = styled.div`
|
|||||||
export const HeaderContainer = styled.div`
|
export const HeaderContainer = styled.div`
|
||||||
width: 280px;
|
width: 280px;
|
||||||
flex: 0 0 280px;
|
flex: 0 0 280px;
|
||||||
background: #666666;
|
background: #141414;
|
||||||
min-height: 100vh;
|
min-height: 100vh;
|
||||||
align-self: stretch;
|
align-self: stretch;
|
||||||
`;
|
`;
|
||||||
|
|||||||
Reference in New Issue
Block a user