diff --git a/src/apis/Users.js b/src/apis/Users.js index fd0e683..82b6ab5 100644 --- a/src/apis/Users.js +++ b/src/apis/Users.js @@ -12,7 +12,7 @@ export const UserView = async (token, searchType, searchKey) => { { headers: { Authorization: `Bearer ${token}` } }, ); - return res.data.data.result; + return res.data; } catch (e) { if (e instanceof Error) { throw new Error('UserView Error', e); diff --git a/src/components/DataManage/UserDressInfo.js b/src/components/DataManage/UserDressInfo.js index b4b7fef..cfacade 100644 --- a/src/components/DataManage/UserDressInfo.js +++ b/src/components/DataManage/UserDressInfo.js @@ -93,12 +93,6 @@ const UserInfoTable = styled.table` font-size: 13px; border-radius: 15px; overflow: hidden; - tr:first-child { - th, - td { - border-top: 0; - } - } th, td { height: 36px; diff --git a/src/components/DataManage/UserTattooInfo.js b/src/components/DataManage/UserTattooInfo.js index 6c4107b..f34efa5 100644 --- a/src/components/DataManage/UserTattooInfo.js +++ b/src/components/DataManage/UserTattooInfo.js @@ -4,7 +4,7 @@ import { useState, useEffect } from 'react'; import { UserTattooView } from '../../apis/Users'; import { TableSkeleton } from '../Skeleton/TableSkeleton'; -const UserTatttooInfo = ({ userInfo }) => { +const UserTattooInfo = ({ userInfo }) => { const [dataList, setDataList] = useState(); const [loading, setLoading] = useState(true); @@ -62,7 +62,7 @@ const UserTatttooInfo = ({ userInfo }) => { ); }; -export default UserTatttooInfo; +export default UserTattooInfo; const UserDefaultTable = styled.table` border: 1px solid #e8eaec; diff --git a/src/components/ServiceManage/ImageUploadBtn.js b/src/components/ServiceManage/ImageUploadBtn.js index 2f62830..84fa3a3 100644 --- a/src/components/ServiceManage/ImageUploadBtn.js +++ b/src/components/ServiceManage/ImageUploadBtn.js @@ -32,6 +32,18 @@ const ImageUploadBtn = ({ disabled, if (!file) return; + const koreanRegex = /[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/; + if (koreanRegex.test(file.name)) { + showToast('FILE_KOREAN_NAME_WARNING', { + type: alertTypes.warning + }); + if (document.querySelector('#fileinput')) { + document.querySelector('#fileinput').value = ''; + } + onFileDelete(); + return; + } + // 이미지 파일 확장자 체크 const fileExt = file.name.split('.').pop().toLowerCase(); if (fileExt !== 'png' && fileExt !== 'jpg' && fileExt !== 'jpeg') { diff --git a/src/components/common/Date/DateRangePicker.js b/src/components/common/Date/DateRangePicker.js index 864e8ef..de7c0b9 100644 --- a/src/components/common/Date/DateRangePicker.js +++ b/src/components/common/Date/DateRangePicker.js @@ -1,79 +1,29 @@ -import React from 'react'; -import DatePickerComponent from './DatePickerComponent'; -import { DatePickerWrapper } from '../../../styles/Components'; -import { - FormRowGroup, - FormLabel, - DateContainer, - DateTimeWrapper, - DateTimeGroup, -} from '../../../styles/ModuleComponents'; -import { useTranslation } from 'react-i18next'; +import { DatePicker } from 'antd'; +import dayjs from 'dayjs'; + +const { RangePicker } = DatePicker; const DateRangePicker = ({ - label, - startDate, - endDate, - onStartDateChange, - onEndDateChange, - pastDate = new Date(), - disabled, - startLabel = '시작 일자', - endLabel = '종료 일자', - setAlert, + value, + onChange, + format, + showTime = true, + size = 'middle', + ...props }) => { - const { t } = useTranslation(); - - const handleStartDate = (date) => { - const newDate = new Date(date); - onStartDateChange(newDate); - }; - - const handleEndDate = (date) => { - let newDate = new Date(date); - - if (startDate && newDate < startDate) { - setAlert(t('DATE_START_DIFF_END')); - newDate = new Date(startDate); - } - - onEndDateChange(newDate); - }; - return ( - - {label} - - - - - - - - - - - - - - - - - - + ); }; + export default DateRangePicker; \ No newline at end of file diff --git a/src/components/common/Header/Navi_bak.js b/src/components/common/Header/Navi_bak.js new file mode 100644 index 0000000..2db1244 --- /dev/null +++ b/src/components/common/Header/Navi_bak.js @@ -0,0 +1,205 @@ +import { NavLink, useNavigate } from 'react-router-dom'; +import arrowIcon from '../../../assets/img/icon/icon-tab.png'; +import styled from 'styled-components'; +import { useRecoilValue } from 'recoil'; +import { authList } from '../../../store/authList'; +import Modal from '../modal/Modal'; +import { BtnWrapper, ButtonClose, ModalText } from '../../../styles/Components'; +import { useEffect, useState } from 'react'; +import Button from '../button/Button'; +import { useLocation } from 'react-router-dom'; +import { AuthInfo } from '../../../apis'; +import { getMenuConfig } from '../../../utils'; +import { adminAuthLevel } from '../../../assets/data/types'; + +const Navi = () => { + const token = sessionStorage.getItem('token'); + const userInfo = useRecoilValue(authList); + const menu = getMenuConfig(userInfo); + + const [modalClose, setModalClose] = useState('hidden'); + const [logoutModalClose, setLogoutModalClose] = useState('hidden'); + const location = useLocation(); + const navigate = useNavigate(); + + const handleToken = async () => { + const tokenStatus = await AuthInfo(token); + + tokenStatus.message === '잘못된 타입의 토큰입니다.' && setLogoutModalClose('view'); + }; + + useEffect(() => { + handleToken(); + }, [token]); + + const handleTopMenu = e => { + e.preventDefault(); + e.target.classList.toggle('active'); + }; + + const handleLink = e => { + let topActive = document.querySelectorAll('nav .active'); + let currentTopMenu = e.target.closest('ul').previousSibling; + for (let i = 0; i < topActive.length; i++) { + if (topActive[i] !== currentTopMenu) { + topActive[i].classList.remove('active'); + } + } + + handleToken(); + }; + + // 등록 완료 모달 + const handleModalClose = () => { + if (modalClose === 'hidden') { + setModalClose('view'); + } else { + setModalClose('hidden'); + } + }; + + // 로그아웃 안내 모달 + const handleConfirmClose = () => { + if (logoutModalClose === 'hidden') { + setLogoutModalClose('view'); + } else { + setLogoutModalClose('hidden'); + sessionStorage.removeItem('token'); + + navigate('/'); + } + }; + + const isClickable = (submenu) => { + switch (userInfo.auth_level_type) { + case adminAuthLevel.DEVELOPER: + case adminAuthLevel.READER: + case adminAuthLevel.MASTER: + return true; + default: + return submenu.authLevel === adminAuthLevel.NONE && userInfo.auth_list && userInfo.auth_list.some(auth => auth.id === submenu.id); + } + } + + return ( + <> + + {/* 접근 불가 모달 */} + + + + + + 해당 메뉴에 대한 조회 권한이 없습니다. +
+ 권한 등급을 변경 후 다시 이용해주세요. +
+ +