diff --git a/src/components/ServiceManage/modal/BoardInfoModal.js b/src/components/ServiceManage/modal/BoardInfoModal.js
index f6310eb..0be5e12 100644
--- a/src/components/ServiceManage/modal/BoardInfoModal.js
+++ b/src/components/ServiceManage/modal/BoardInfoModal.js
@@ -13,6 +13,7 @@ import { NoticeModify } from '../../../apis';
import { useTranslation } from 'react-i18next';
import { convertKTC, convertKTCDate } from '../../../utils';
import { languageType } from '../../../assets/data/options';
+import { CopyBtn } from '../../../styles/ModuleComponents';
const BoardInfoModal = ({ detailView, setDetailView, content, id, setIsCopyData, openRegistModal, userInfo }) => {
let viewOnly = userInfo.auth_list && !userInfo.auth_list.some(auth => auth.id === 17); // 조회만 가능 권한
@@ -980,12 +981,6 @@ const MessageBox = styled.div`
}
`;
-const CopyBtn = styled.div`
- position: absolute;
- right: 0;
- top: 0;
-`;
-
const InGameModalText = styled(ModalText)`
font-size: 16px;
line-height: 24px;
diff --git a/src/components/ServiceManage/modal/EventDetailModal.js b/src/components/ServiceManage/modal/EventDetailModal.js
index f065a14..419537b 100644
--- a/src/components/ServiceManage/modal/EventDetailModal.js
+++ b/src/components/ServiceManage/modal/EventDetailModal.js
@@ -8,7 +8,7 @@ import { EventIsItem, EventModify } from '../../../apis';
import { authList } from '../../../store/authList';
import { useRecoilValue } from 'recoil';
import { useTranslation } from 'react-i18next';
-import { authType, benItems, commonStatus, wellType } from '../../../assets/data';
+import { authType, benItems, commonStatus, currencyType } from '../../../assets/data';
import {
AppendRegistBox, AppendRegistTable, AreaBtnClose,
BtnDelete, DetailInputItem, DetailInputRow,
@@ -177,7 +177,7 @@ const EventDetailModal = ({ detailView, handleDetailView, content, setDetailData
const item_cnt = resultData.item_list[itemIndex].item_cnt;
resultData.item_list[itemIndex].item_cnt = Number(item_cnt) + Number(resourceCount);
} else {
- const name = wellType.find(well => well.value === resource).name;
+ const name = currencyType.find(well => well.value === resource).name;
const newItem = { item: resource, item_cnt: resourceCount, item_name: name };
resultData.item_list.push(newItem);
}
@@ -447,7 +447,7 @@ const EventDetailModal = ({ detailView, handleDetailView, content, setDetailData
|
setResource(e.target.value)} value={resource} disabled={isReadOnly}>
- {wellType.map((data, index) => (
+ {currencyType.map((data, index) => (
diff --git a/src/components/ServiceManage/modal/MailDetailModal.js b/src/components/ServiceManage/modal/MailDetailModal.js
index 596ccbe..d0e9686 100644
--- a/src/components/ServiceManage/modal/MailDetailModal.js
+++ b/src/components/ServiceManage/modal/MailDetailModal.js
@@ -1,9 +1,9 @@
import { styled } from 'styled-components';
import RadioInput from '../../common/input/Radio';
-import { useState, useEffect, Fragment } from 'react';
+import React, { useState, useEffect, Fragment } from 'react';
import CheckBox from '../../common/input/CheckBox';
-import { Title, SelectInput, BtnWrapper, TextInput, Label, InputLabel, DatePickerWrapper, Textarea, ModalText, ButtonClose, SearchBarAlert } from '../../../styles/Components';
+import { Title, SelectInput, BtnWrapper, TextInput, Label, InputLabel, DatePickerWrapper, Textarea} from '../../../styles/Components';
import Button from '../../common/button/Button';
import Modal from '../../common/modal/Modal';
@@ -11,57 +11,68 @@ import IconDelete from '../../../assets/img/icon/icon-delete.png';
import CloseIcon from '../../../assets/img/icon/icon-close.png';
import DatePickerComponent from '../../common/Date/DatePickerComponent';
import MailRegistUploadBtn from '../MailRegistUploadBtn';
-import { benItems, HourList, MinuteList, modalTypes, wellType } from '../../../assets/data';
-import { EventModify, MailModify } from '../../../apis';
+import {
+ authType,
+ benItems, commonStatus,
+ HourList,
+ mailType,
+ MinuteList,
+ userType,
+ currencyType,
+} from '../../../assets/data';
+import { MailCaliumTotalView, MailIsItem, MailModify } from '../../../apis';
import { authList } from '../../../store/authList';
import { useRecoilValue } from 'recoil';
-import { convertKTC, convertKTCDate, timeDiffMinute } from '../../../utils';
-import { useTranslation } from 'react-i18next';
-import DynamicModal from '../../common/modal/DynamicModal';
+import { convertKTC, convertKTCDate } from '../../../utils';
+import { useNavigate } from 'react-router-dom';
+import { useDataFetch } from '../../../hooks/hook';
+import { useAlert } from '../../../context/AlertProvider';
+import { useLoading } from '../../../context/LoadingProvider';
+import { alertTypes, currencyCodeTypes } from '../../../assets/data/types';
+import { userType2 } from '../../../assets/data/options';
const MailDetailModal = ({ detailView, handleDetailView, content }) => {
const userInfo = useRecoilValue(authList);
- const { t } = useTranslation();
const token = sessionStorage.getItem('token');
+ const navigate = useNavigate();
+ const {showModal, showToast} = useAlert();
+ const {withLoading} = useLoading();
const id = content && content.id;
- const onlyView = userInfo.auth_list && !userInfo.auth_list.some(auth => auth.id === 23);
- const updateAuth = userInfo.auth_list && userInfo.auth_list.some(auth => auth.id === 23);
+ const updateAuth = userInfo.auth_list && userInfo.auth_list.some(auth => auth.id === authType.mailUpdate);
const [sendHour, setSendHour] = useState('00');
const [sendMin, setSendMin] = useState('00');
const [item, setItem] = useState('');
const [itemCount, setItemCount] = useState('');
- const [resource, setResource] = useState('19010001');
+ const [resource, setResource] = useState(currencyCodeTypes.gold);
const [resourceCount, setResourceCount] = useState('');
- const [modifyModal, setModifyModal] = useState('hidden');
- const [completeModal, setCompleteModal] = useState('hidden');
- const [resultData, setResultData] = useState({});
-
- const [modalState, setModalState] = useState({
- updateConfirmModal: 'hidden',
- updateCompleteModal: 'hidden',
+ const [resultData, setResultData] = useState({
+ is_reserve: false,
+ send_dt: '',
+ mail_type: 'SELECT',
+ receive_type: 'SINGLE',
+ user_type: 'GUID',
+ mail_list: [],
+ item_list: [],
+ guid: '',
});
- const [isNullValue, setIsNullValue] = useState(false);
// 과거 판단
- const [isPast, setIsPast] = useState(false);
+ const [isView, setIsView] = useState(true);
const [isChanged, setIsChanged] = useState(false);
- const [isItemNullValue, setIsItemNullValue] = useState(false);
- const [excelFile, setExcelFile] = useState(content.target ? content.target : '');
- const [excelName, setExcelName] = useState(null);
+ const [excelFile, setExcelFile] = useState('');
const [downloadData, setDownLoadData] = useState(null);
const [btnValidation, setBtnValidation] = useState(false);
- const [updateMessage, setUpdateMessage] = useState('수정이 완료되었습니다.');
- const [alertMessage, setAlertMessage] = useState('');
- const [undefinedFile, setUndefinedFile] = useState(false);
- const [disabledBtn, setDisabledBtn] = useState(false); // 예약 발송 확인용
- const [alertMsg, setAlertMsg] = useState('');
+
+ const {
+ data: caliumTotalData,
+ } = useDataFetch(() => MailCaliumTotalView(token), [token]);
const KOREAN_TIME = content && convertKTCDate(content.send_dt);
@@ -72,39 +83,43 @@ const MailDetailModal = ({ detailView, handleDetailView, content }) => {
};
useEffect(() => {
- document.querySelector('#fileinput').value = '';
+ if(content) {
+ setResultData({
+ ...resultData,
+ is_reserve: content.is_reserve,
+ send_dt: KOREAN_TIME,
+ mail_type: content.mail_type,
+ receive_type: content.receive_type,
+ mail_list: content.mail_list,
+ item_list: content.item_list,
+ guid: content.target,
+ file_name: content.receive_type === 'MULTIPLE' ? content.target : null
+ });
- setResultData({
- is_reserve: content && content.is_reserve,
- send_dt: content && KOREAN_TIME,
- mail_type: content && content.mail_type,
- receive_type: content && content.receive_type,
- user_type: content && content.user_type,
- mail_list: content && content.mail_list,
- item_list: content && content.item_list,
- guid: content && content.target,
- });
-
- content && content.mail_list.length === 1 && setBtnValidation(true);
- content && content.is_reserve === false && setBtnValidation(true);
-
- setItem('');
- KOREAN_TIME < new Date ? setIsPast(true) : setIsPast(false);
- setExcelFile(content && content.target);
- setDownLoadData(content && content.target);
- setDisabledBtn(content && content.is_reserve && false);
-
- // 복수 or 단일일 때 content.target을 exel name 으로 지정
- (content && content.receive_type === 'MULTIPLE') ?
- setExcelName(content && content.target)
- : setExcelName('')
+ content.mail_list.length === 1 && setBtnValidation(true);
+ content.is_reserve === false && setBtnValidation(true);
+ setItem('');
+ if (content.receive_type === 'MULTIPLE') {
+ setDownLoadData(content.target);
+ setExcelFile(content.target);
+ }
+ }
}, [content]);
- // console.log('downloadData', downloadData);
- // console.log('isPast', isPast);
- // console.log("guid", resultData.guid)
- // console.log("메일 형식", content && content.receive_type," 엑셀네임", excelName)
+ useEffect(() => {
+ if(content){
+ if(!updateAuth
+ || !content.is_reserve
+ || (content.is_reserve && convertKTCDate(content.send_dt) < new Date)
+ || (content.send_status === commonStatus.fail || content.send_status === commonStatus.finish)
+ ){
+ setIsView(true);
+ }else{
+ setIsView(false);
+ }
+ }
+ },[updateAuth, content, resultData])
// 아이템 수량 숫자 체크
const handleItemCount = e => {
@@ -120,25 +135,41 @@ const MailDetailModal = ({ detailView, handleDetailView, content }) => {
};
// 아이템 추가
- const handleItemList = () => {
+ const handleItemList = async () => {
if(benItems.includes(item)){
- setAlertMsg(t('MAIL_ITEM_ADD_BEN'))
+ showToast('MAIL_ITEM_ADD_BEN',{type: alertTypes.warning});
return;
}
- item.length === 0 || itemCount.length === 0 ? setIsItemNullValue(true) : setIsItemNullValue(false);
-
- if (item.length === '' || itemCount.length === 0 || itemCount <= 0) {
- setIsItemNullValue(true);
- } else if (item.length !== 0) {
- setIsItemNullValue(false);
- setIsChanged(true);
-
- const newItem = { item: item, item_cnt: itemCount };
- resultData.item_list.push(newItem);
-
- setItem('');
- setItemCount('');
+ if(item.length === 0 || itemCount.length === 0 || itemCount <= 0){
+ showToast('COUNT_EMPTY_WARNING', { type: alertTypes.warning });
+ return;
}
+
+ await withLoading(async () => {
+ return await MailIsItem(token, { item: item });
+ }).then(data => {
+ if (data.result === 'ERROR') {
+ showToast(data.data.message, { type: alertTypes.warning });
+ }else{
+ const itemIndex = resultData.item_list.findIndex(
+ data => data.item === item
+ );
+
+ if (itemIndex !== -1) {
+ showToast('MAIL_ITEM_ADD_DUPL', { type: alertTypes.warning });
+ return;
+ }
+ const newItem = { item: item, item_cnt: itemCount, item_name: data.data.item_info.item_name };
+
+ resultData.item_list.push(newItem);
+
+ setIsChanged(true);
+ setItem('');
+ setItemCount('');
+ }
+ }).catch(e => {
+ showToast(e, { type: alertTypes.error });
+ });
};
// 아이템 삭제
@@ -146,8 +177,6 @@ const MailDetailModal = ({ detailView, handleDetailView, content }) => {
let filterList = resultData.item_list && resultData.item_list.filter(item => item !== resultData.item_list[id]);
setIsChanged(true);
- // console.log('filterList', filterList);
-
setResultData({ ...resultData, item_list: filterList });
};
@@ -166,17 +195,35 @@ const MailDetailModal = ({ detailView, handleDetailView, content }) => {
// 자원 추가
const handleResourceList = () => {
- resourceCount.length === 0 ? setIsItemNullValue(true) : setIsItemNullValue(false);
-
if (resourceCount.length === 0 || resourceCount <= 0) {
- setIsItemNullValue(true);
+ showToast('COUNT_EMPTY_WARNING', { type: alertTypes.warning });
} else {
- setIsItemNullValue(false);
- const name = wellType.find(well => well.value === resource).name;
- const newItem = { item: resource, item_cnt: resourceCount, item_name: name };
+ const itemIndex = resultData.item_list.findIndex(
+ (item) => item.item === resource,
+ );
+
+ if (itemIndex !== -1) {
+ const item_cnt = resultData.item_list[itemIndex].item_cnt;
+ if (resource === currencyCodeTypes.calium) {
+ if ((Number(resourceCount) + Number(item_cnt)) > caliumTotalData) {
+ showToast('MAIL_ITEM_CALIUM_TOTAL_OVER_WARNING', { type: alertTypes.warning });
+ return;
+ }
+ }
+ resultData.item_list[itemIndex].item_cnt = Number(item_cnt) + Number(resourceCount);
+ } else {
+ if (resource === currencyCodeTypes.calium) {
+ if (Number(resourceCount) > caliumTotalData) {
+ showToast('MAIL_ITEM_CALIUM_TOTAL_OVER_WARNING', { type: alertTypes.warning });
+ return;
+ }
+ }
+ const name = currencyType.find(well => well.value === resource).name;
+ const newItem = { item: resource, item_cnt: resourceCount, item_name: name };
+ resultData.item_list.push(newItem);
+ }
+ setIsChanged(true);
- resultData.item_list.push(newItem);
-
setResourceCount('');
}
};
@@ -213,149 +260,79 @@ const MailDetailModal = ({ detailView, handleDetailView, content }) => {
setResultData({ ...resultData, send_dt: result });
};
- // 우편 상세 정보 수정
- const handleModifyModal = () => {
- if (
- resultData.mail_list.map(data => data.content === '' || data.title === '').includes(true) ||
- (resultData.receive_type === 'MULTIPLE' ? excelFile === null : resultData.guid === '') ||
- resultData.send_dt.length === 0 ||
- resultData.mail_type === 'SELECT' ||
- isChanged === false ||
- alertMessage
- ) {
- isChanged === true && setIsNullValue(true);
- } else {
- // 복수로 수정하거나 복수로 등록할 때 항상 excel name을 넘겨줘야합니다.
- content && content.receive_type === 'MULTIPLE' ? setResultData({ ...resultData, file_name: excelName === null ? downloadData : excelName }) : setExcelName('');
-
- // setExcelName(content && content.target)
-
- setIsNullValue(false);
- if (modifyModal === 'hidden') {
- setModifyModal('view');
- } else {
- setModifyModal('hidden');
- }
- }
- };
-
- // 상세 정보 단일 체크
- const handleSingleBtn = () => {
- if (content && content.is_reserve === true && !onlyView && !isPast) {
- setResultData({ ...resultData, guid: '' });
- delete resultData.file_name;
-
- document.querySelector('#fileinput').value = '';
-
- setExcelFile(null);
- setIsChanged(true);
- }
-
- };
-
- // 상세 정보 복수 체크
- const handleMultiBtn = () => {
- if (content && content.is_reserve === true) {
- delete resultData.guid;
- }
- setIsChanged(true);
- };
-
- // 완료 모달창
- const handleCompleteModal = () => {
- if (completeModal === 'hidden') {
- setCompleteModal('view');
- } else {
- setCompleteModal('hidden');
-
- window.location.reload();
- }
- };
-
- // 메일 수정 버튼
- const handleModifyMail = () => {
-
- if(resultData.receive_type === 'MULTIPLE') {
- delete resultData.guid
-
- MailModify(token, id, resultData);
- } else {
- MailModify(token, id, resultData);
- }
-
- handleCompleteModal();
- handleModifyModal();
- };
-
// 확인 버튼 후 다 초기화
const handleReset = () => {
+ setItem('');
+ setItemCount('');
+ setResource(currencyCodeTypes.gold);
+ setResourceCount('');
setBtnValidation(false);
- setIsNullValue(false);
setIsChanged(false);
- setUndefinedFile(false);
- setIsItemNullValue(false);
- setAlertMessage('');
setExcelFile(null);
- setExcelName(null);
};
- // 상세 페이지에서 파일 삭제
- const handleDetailDelete = e => {
- e.preventDefault();
+ //내용복사
+ const handleCopyContent = () => {
+ const mailData = {
+ is_reserve: resultData.is_reserve,
+ mail_type: resultData.mail_type,
+ mail_list: resultData.mail_list,
+ item_list: resultData.item_list,
+ resource_list: resultData.resource_list,
+ receive_type: resultData.receive_type,
+ user_type: resultData.user_type,
+ guid: resultData.guid
+ };
- if (content && content.is_reserve === true) {
- setDownLoadData(undefined);
- setUndefinedFile(true);
- setResultData({ ...resultData, guid: '' });
- delete resultData.file_name;
+ // 복사한 데이터를 세션 스토리지에 저장
+ sessionStorage.setItem('copyMailData', JSON.stringify(mailData));
- document.querySelector('#fileinput').value = '';
-
- setExcelFile(null);
- }
-
- setIsChanged(true);
+ navigate('/servicemanage/mail/mailregist');
};
- const handleModalView = (type) => {
- setModalState((prevState) => ({
- ...prevState,
- [`${type}Modal`]: 'view',
- }));
- }
-
- const handleModalClose = (type) => {
- setModalState((prevState) => ({
- ...prevState,
- [`${type}Modal`]: 'hidden',
- }));
- }
+ const checkCondition = () => {
+ return (
+ content &&
+ resultData?.mail_list?.every(data => data.content !== '' && data.title !== '')
+ && ((resultData.is_reserve === true && resultData.send_dt !== '') || resultData.is_reserve === false)
+ && (resultData.receive_type === 'MULTIPLE' ? excelFile !== null : resultData.guid !== '')
+ && resultData.mail_type !== 'SELECT'
+ && isChanged
+ );
+ };
const handleSubmit = async (type, param = null) => {
switch (type) {
case "submit":
- // if (!conditionCheck()) return;
+ if (!checkCondition()) return;
- handleModalView('updateConfirm');
+ showModal('MAIL_UPDATE_SAVE', {
+ type: alertTypes.confirm,
+ onConfirm: () => handleSubmit('updateConfirm')
+ })
break;
case "updateConfirm":
- const timeDiff = timeDiffMinute(resultData.start_dt, (new Date))
- // 이벤트 시작 30분전이나 이미 SystemMail이 add된 상태에서는 수정할 수 없다.
- if(content.add_flag || timeDiff <= 30){
- setAlertMsg(t('EVENT_TIME_LIMIT_UPDATE'));
- handleModalClose('updateConfirm');
- return;
- }
- EventModify(token, id, resultData);
- handleModalClose('updateConfirm');
- handleModalView('updateComplete');
- break;
- case "updateComplete":
- handleModalClose('updateComplete');
- window.location.reload();
- break;
- case "warning":
- setAlertMsg('');
+ await withLoading(async () => {
+ if(resultData.receive_type === 'MULTIPLE') {
+ delete resultData.guid
+
+ return await MailModify(token, id, resultData);
+ } else {
+ return await MailModify(token, id, resultData);
+ }
+ }).then(data => {
+ if(data.result === 'SUCCESS') {
+ showToast('UPDATE_COMPLETED', {type: alertTypes.success});
+ handleDetailView();
+ handleReset();
+ }else{
+ showToast(data.data.message, {type: alertTypes.error});
+ }
+ }).catch(error => {
+ showToast('API_FAIL', {type: alertTypes.error});
+ }).finally(() => {
+
+ });
break;
}
}
@@ -364,14 +341,14 @@ const MailDetailModal = ({ detailView, handleDetailView, content }) => {
<>
우편 상세 정보
-
+ {content && <>
- 등록자 : {content && content.create_by}
- 등록일 : {content && convertKTC(content.create_dt, false)}
- {content && typeof content.update_by !== 'undefined' && (
+ 등록자 : {content.create_by}
+ 등록일 : {convertKTC(content.create_dt, false)}
+ {typeof content.update_by !== 'undefined' && (
<>
- 수정자 : {content && content.update_by}
- 수정일 : {content && convertKTC(content.update_dt, false)}
+ 수정자 : {content.update_by}
+ 수정일 : {convertKTC(content.update_dt, false)}
>
)}
@@ -384,23 +361,20 @@ const MailDetailModal = ({ detailView, handleDetailView, content }) => {
checked={resultData && resultData.is_reserve}
setData={e => {
setResultData({ ...resultData, is_reserve: e.target.checked });
- setDisabledBtn(e.target.checked);
setIsChanged(true);
}}
- disabled={(content && content.is_reserve === false) || onlyView}
+ disabled={(content.is_reserve === false) || isView}
/>
- {content && content.is_reserve === false ? (
+ {content.is_reserve === false ? (
<>>
) : (
- content &&
- content.is_reserve === true &&
resultData.is_reserve === true && (
발송 시간
handleSelectedDate(data)}
@@ -410,24 +384,14 @@ const MailDetailModal = ({ detailView, handleDetailView, content }) => {
handleSendTime(e)}
id="hour"
- disabled={(content && content.is_reserve === false) || onlyView || isPast}
+ disabled={(content.is_reserve === false) || isView}
value={
resultData && String(new Date(resultData.send_dt).getHours()) < 10
? '0' + String(new Date(resultData.send_dt).getHours())
: resultData && String(new Date(resultData.send_dt).getHours())
}>
{HourList.map(hour => (
-
))}
@@ -438,24 +402,14 @@ const MailDetailModal = ({ detailView, handleDetailView, content }) => {
setIsChanged(true);
}}
id="min"
- disabled={(content && content.is_reserve === false) || onlyView || isPast}
+ disabled={(content.is_reserve === false) || isView}
value={
resultData && String(new Date(resultData.send_dt).getMinutes()) < 10
? '0' + String(new Date(resultData.send_dt).getMinutes())
: resultData && String(new Date(resultData.send_dt).getMinutes())
}>
{MinuteList.map(min => (
-
))}
@@ -471,21 +425,22 @@ const MailDetailModal = ({ detailView, handleDetailView, content }) => {
setResultData({ ...resultData, mail_type: e.target.value });
setIsChanged(true);
}}
- value={content && resultData.mail_type}
- disabled={(content && content.is_reserve === false) || onlyView || isPast}>
+ value={resultData.mail_type}
+ disabled={isView}>
-
-
-
-
+ {mailType.filter(data => data.value !== 'ALL').map((data, index) => (
+
+ ))}
발송상태
- {content && initialData.send_status === 'WAIT' && 대기}
- {content && initialData.send_status === 'FINISH' && 완료}
- {content && initialData.send_status === 'FAIL' && 실패}
+ {initialData.send_status === 'WAIT' && 대기}
+ {initialData.send_status === 'FINISH' && 완료}
+ {initialData.send_status === 'FAIL' && 실패}
@@ -493,9 +448,14 @@ const MailDetailModal = ({ detailView, handleDetailView, content }) => {
수신대상
- setResultData({ ...resultData, user_type: e.target.value })} value={resultData.user_type} disabled={(content && content.is_reserve === false) || onlyView || isPast}>
-
-
+ setResultData({ ...resultData, user_type: e.target.value })}
+ value={resultData.user_type}
+ disabled={true}>
+ {userType2.map((data, index) => (
+
+ ))}
@@ -505,91 +465,43 @@ const MailDetailModal = ({ detailView, handleDetailView, content }) => {
id="SINGLE"
name="receiver"
value="SINGLE"
- disabled={(content && content.is_reserve === false) || onlyView || isPast}
+ disabled={true}
fontWeight="600"
checked={resultData.receive_type === 'SINGLE'}
- handleChange={e => {
- setResultData({ ...resultData, receive_type: e.target.id });
- setIsChanged(true);
- }}
- handleClick={handleSingleBtn}
/>
{
- let list = [...resultData.guid];
- list = e.target.value;
- setResultData({ ...resultData, guid: list });
- setIsChanged(true);
- }}
/>
- {content && resultData.receive_type === 'MULTIPLE' && typeof resultData.guid !== 'undefined' ? (
-
-
-
-
- ) : (
-
- setResultData({ ...resultData, receive_type: e.target.id })}
- handleClick={handleMultiBtn}
- />
-
-
- )}
+
+
+ {}}
+ disabledBtn={true}
+ excelName={excelFile}
+ setExcelName={setExcelFile}
+ downloadData={downloadData}
+ status={initialData.send_status}
+ />
+
{resultData.mail_list &&
- resultData.mail_list.map(data => {
+ resultData?.mail_list?.map(data => {
return (
@@ -597,6 +509,7 @@ const MailDetailModal = ({ detailView, handleDetailView, content }) => {
언어 : {data.language}
{btnValidation === false ? (
{
e.preventDefault();
onLangDelete(data.language);
@@ -619,7 +532,7 @@ const MailDetailModal = ({ detailView, handleDetailView, content }) => {
maxLength="30"
id={data.language}
value={data.title}
- readOnly={(content && content.is_reserve === false) || onlyView || isPast}
+ readOnly={(content.is_reserve === false) || isView}
onChange={e => {
let list = [...resultData.mail_list];
let findIndex = resultData.mail_list && resultData.mail_list.findIndex(item => item.language === e.target.id);
@@ -639,7 +552,7 @@ const MailDetailModal = ({ detailView, handleDetailView, content }) => {
|
@@ -724,17 +616,32 @@ const MailDetailModal = ({ detailView, handleDetailView, content }) => {
- setResource(e.target.value)} value={resource} disabled={(content && content.is_reserve === false) || onlyView || isPast}>
- {wellType.map((data, index) => (
+ setResource(e.target.value)} value={resource} disabled={isView}>
+ {currencyType.map((data, index) => (
))}
- handleResourceCount(e)} width="200px" />
-
+ handleResourceCount(e)}
+ width="200px"
+ />
+
+ {resource === currencyCodeTypes.calium &&
+ }
- {isItemNullValue && 필수값을 입력해주세요.}
{resultData.item_list && (
@@ -745,7 +652,7 @@ const MailDetailModal = ({ detailView, handleDetailView, content }) => {
{data.item_name}[{data.item}] ({data.item_cnt})
- {(content && content.is_reserve === true) || onlyView || isPast && onItemRemove(index)}>}
+ {!isView && onItemRemove(index)}>}
);
})}
@@ -758,6 +665,7 @@ const MailDetailModal = ({ detailView, handleDetailView, content }) => {
+ >}
- {/* 확인 모달 */}
-
-
-
-
-
- 우편 정보 수정사항을
- 저장하시겠습니까?
-
-
-
-
-
-
- {/* 완료 모달 */}
-
-
-
-
- 수정이 완료되었습니다.
-
-
-
-
- {/* 경고 모달 */}
- handleSubmit('warning')}
- />
>
);
};
diff --git a/src/components/ServiceManage/modal/UserBlockDetailModal.js b/src/components/ServiceManage/modal/UserBlockDetailModal.js
index 5102439..c229efa 100644
--- a/src/components/ServiceManage/modal/UserBlockDetailModal.js
+++ b/src/components/ServiceManage/modal/UserBlockDetailModal.js
@@ -5,7 +5,7 @@ import { Title, TableStyle, BtnWrapper, TextInput } from '../../../styles/Compon
import Modal from '../../common/modal/Modal';
import Button from '../../common/button/Button';
import { convertKTC } from '../../../utils';
-import { blockPeriod, blockSanctions, blockType } from '../../../assets/data';
+import { blockPeriod, blockSanctions, blockStatus, blockType, commonStatus } from '../../../assets/data';
const UserBlockDetailModal = ({ stateModal, handleModal, data }) => {
const [history, setHistory] = useState();
@@ -27,40 +27,59 @@ const UserBlockDetailModal = ({ stateModal, handleModal, data }) => {
-
- | 유저 GUID |
+
+ | 유저 GUID |
+
+
+ |
+ 아바타명 |
+
+
+ |
+
+
+ | 제재 기간 |
+
+
+ item.value === data.period)?.name}
+ disabled />
+ 시작일 : {convertKTC(data.start_dt, false)}
+ 종료일 : {convertKTC(data.end_dt, false)}
+
+ |
+
+
+ | 제재 방식 |
+
+ item.value === data.type)?.name}
+ disabled />
+ |
+ 상태 |
+
+ item.value === data.status)?.name}
+ disabled />
+ |
+
+
+ | 제재 사유 |
+
+ item.value === data.sanctions)?.name}
+ disabled />
+ |
+ {data.status === commonStatus.cancel &&
+ <>
+ 해지 사유 |
-
+
|
- 아바타명 |
-
-
- |
-
-
- | 제재 방식 |
-
- item.value === data.type)?.name} disabled />
- |
- |
- |
-
-
- | 제재 기간 |
-
-
- item.value === data.period)?.name} disabled />
- 시작일 : {convertKTC(data.start_dt, false)}
- 종료일 : {convertKTC(data.end_dt, false)}
-
- |
-
-
- | 제재 사유 |
-
- item.value === data.sanctions)?.name} disabled />
- |
-
+ >
+ }
+
@@ -68,10 +87,10 @@ const UserBlockDetailModal = ({ stateModal, handleModal, data }) => {
전체 제재 이력({history && history.length}건)
-
-
- | 일자 |
- 제재 기간 |
+
+
+ | 일자 |
+ 제재 기간 |
제재 방식 |
제재 사유 |
등록자 |
diff --git a/src/components/ServiceManage/searchBar/LandAuctionSearchBar.js b/src/components/ServiceManage/searchBar/LandAuctionSearchBar.js
index 8d83eb4..471a6e6 100644
--- a/src/components/ServiceManage/searchBar/LandAuctionSearchBar.js
+++ b/src/components/ServiceManage/searchBar/LandAuctionSearchBar.js
@@ -3,7 +3,7 @@ import Button from '../../common/button/Button';
import { SearchBarLayout, SearchPeriod } from '../../common/SearchBar';
import { useCallback, useEffect, useState } from 'react';
import { LandAuctionView } from '../../../apis';
-import { landAuctionStatus, landSearchType, landSize, userSearchType } from '../../../assets/data';
+import { landAuctionStatus, landSearchType, landSize, userType } from '../../../assets/data';
export const useLandAuctionSearch = (token, initialPageSize) => {
const [searchParams, setSearchParams] = useState({
@@ -144,7 +144,7 @@ const LandAuctionSearchBar = ({ searchParams, onSearch, onReset }) => {
낙찰자
onSearch({userType: e.target.value })}>
- {userSearchType.map((data, index) => (
+ {userType.map((data, index) => (
diff --git a/src/components/ServiceManage/searchBar/UserBlockSearchBar.js b/src/components/ServiceManage/searchBar/UserBlockSearchBar.js
index 41ad0a4..5043846 100644
--- a/src/components/ServiceManage/searchBar/UserBlockSearchBar.js
+++ b/src/components/ServiceManage/searchBar/UserBlockSearchBar.js
@@ -3,7 +3,7 @@ import { TextInput, BtnWrapper, InputLabel, SelectInput, InputGroup } from '../.
import Button from '../../common/button/Button';
import { SearchBarLayout } from '../../common/SearchBar';
import { blockPeriod, blockSanctions, blockSearchType, blockStatus } from '../../../assets/data';
-import { userSearchType } from '../../../assets/data/options';
+import { userType } from '../../../assets/data/options';
const UserBlockSearchBar = ({ handleSearch, setResultData }) => {
const [searchData, setSearchData] = useState({
@@ -52,7 +52,7 @@ const UserBlockSearchBar = ({ handleSearch, setResultData }) => {
대상
setSearchData({ ...searchData, searchType: e.target.value })}>
- {userSearchType.map((data, index) => (
+ {userType.map((data, index) => (
diff --git a/src/components/common/button/Button.js b/src/components/common/button/Button.js
index 4308561..c5e53d6 100644
--- a/src/components/common/button/Button.js
+++ b/src/components/common/button/Button.js
@@ -5,28 +5,13 @@ import ResetIcon from '../../../assets/img/icon/icon-reset.png';
/**
* @param {string} text 버튼 내부 텍스트
* @param {string} type 버튼 타입 (button, submit)
- * @param {string} errorMessage 표시할 에러 메시지
* @param {() => void} handleClick 버튼 클릭시 실행할 이벤트, Route 기능의 경우 history.push와 같은 함수를 이용합니다.
* @param {string} buttonColor 버튼 배경 색상
* @param {string} hoverColor 버튼 호버 배경 색상
* @param {object} props 폰트 관련 속성
*/
-const Button = ({ text, type = 'button', errorMessage, handleClick, theme, size, width, height, bordercolor, disabled, name }) => {
- const [isShowErrorMessage, setIsShowErrorMessage] = useState(false);
-
- const handleButtonClick = () => {
- if (errorMessage) {
- setIsShowErrorMessage(true);
- } else {
- handleClick?.();
- }
- };
-
- useEffect(() => {
- errorMessage || setIsShowErrorMessage(false);
- }, [errorMessage]);
-
+const Button = ({ text, type = 'button', handleClick, theme, size, width, height, bordercolor, disabled, name }) => {
return (
{text}
- {isShowErrorMessage && {errorMessage}}
);
};
@@ -139,13 +123,4 @@ const ButtonStyle = styled.button`
`}
`;
-const ErrorText = styled.p`
- color: red;
- text-align: center;
- font-weight: 400;
- font-size: 12px;
- margin-top: 10px;
- line-height: 15px;
-`;
-
export default Button;
diff --git a/src/components/common/modal/DynamicModal.js b/src/components/common/modal/DynamicModal.js
index 4b9bcac..d1d8d57 100644
--- a/src/components/common/modal/DynamicModal.js
+++ b/src/components/common/modal/DynamicModal.js
@@ -58,6 +58,7 @@ const DynamicModal = ({modalType, view, handleSubmit, handleCancel, modalText, c
+ {children && children}
{ChildView && }
diff --git a/src/i18n.js b/src/i18n.js
index eb4efdd..652ab16 100644
--- a/src/i18n.js
+++ b/src/i18n.js
@@ -44,6 +44,11 @@ const resources = {
WARNING_TYPE_CHECK: '타입을 확인해주세요.',
DATE_START_DIFF_END_WARNING :"종료일은 시작일보다 하루 이후여야 합니다.",
SEARCH_REQUIRED_WARNING:"필수 입력 항목을 확인해주세요.",
+ INPUT_VALUE_ERROR: "입력 값이 확인되지 않습니다.\n새로고침 후 다시 시도해주세요.",
+ INPUT_REASON_EMPTY_WARNING: "사유를 입력해주세요.",
+ DUPLICATE_USER: "중복된 유저 정보가 있습니다.",
+ COUNT_EMPTY_WARNING: "수량을 입력해주세요.",
+ UPLOAD_FILENAME_SAMPLE_WARNING: "파일명에 sample을 넣을 수 없습니다.\r\n파일명을 변경 후 다시 업로드 해주세요.",
//user
NICKNAME_CHANGES_CONFIRM: '닉네임을 변경하시겠습니까?',
NICKNAME_CHANGES_COMPLETE: '닉네임 변경이 완료되었습니다.',
@@ -137,8 +142,9 @@ const resources = {
// 이용자 제재
USER_BLOCK_VALIDATION_WARNING: '유효성 체크가 통과되지 않은 항목이 존재합니다.\r\n수정 후 재등록 해주세요.',
USER_BLOCK_REGIST_DUPLE_WARNING: '이미 제재가 등록된 유저입니다.',
- USER_BLOCK_DELETE_CONFIRM: '제재 대상을 삭제하시겠습니까?\r\n삭제 시 제재가 해제됩니다.',
+ USER_BLOCK_DELETE_CONFIRM: '제재 대상을 해지하시겠습니까?',
USER_BLOCK_REGIST_CONFIRM: '이용자 제재 명단에\r\n등록하시겠습니까?',
+ USER_BLOCK_DELETE_STATUS_WARNING: '제재를 해지할 수 없는 상태입니다.',
//파일
FILE_IMAGE_EXTENSION_WARNING: "png, jpg 확장자의 이미지만 업로드 가능합니다.",
FILE_IMAGE_UPLOAD_ERROR: "이미지 업로드 중 오류가 발생했습니다.",
diff --git a/src/pages/ServiceManage/Event.js b/src/pages/ServiceManage/Event.js
index 535cea9..0b9f94f 100644
--- a/src/pages/ServiceManage/Event.js
+++ b/src/pages/ServiceManage/Event.js
@@ -100,6 +100,11 @@ const Event = () => {
case "deleteConfirm":
let list = [];
+ if(deleteDesc.length === 0){
+ showToast('INPUT_REASON_EMPTY_WARNING', {type: alertTypes.warning});
+ return;
+ }
+
let isChecked = false;
selectedRows.map(data => {
diff --git a/src/pages/ServiceManage/EventRegist.js b/src/pages/ServiceManage/EventRegist.js
index c3fda19..6b5e5a8 100644
--- a/src/pages/ServiceManage/EventRegist.js
+++ b/src/pages/ServiceManage/EventRegist.js
@@ -27,11 +27,11 @@ import {
RegistInputRow, RegistNotice, RegistTable,
} from '../../styles/ModuleComponents';
import AuthModal from '../../components/common/modal/AuthModal';
-import { authType, benItems, wellType } from '../../assets/data';
+import { authType, benItems, currencyType } from '../../assets/data';
import DateTimeInput from '../../components/common/input/DateTimeInput';
import { timeDiffMinute } from '../../utils';
import { useAlert } from '../../context/AlertProvider';
-import { alertTypes } from '../../assets/data/types';
+import { alertTypes, currencyCodeTypes } from '../../assets/data/types';
import { useLoading } from '../../context/LoadingProvider';
const EventRegist = () => {
@@ -44,7 +44,7 @@ const EventRegist = () => {
const [item, setItem] = useState(''); // 아이템 값
const [itemCount, setItemCount] = useState(''); // 아이템 개수
- const [resource, setResource] = useState('19010001'); // 자원 값
+ const [resource, setResource] = useState(currencyCodeTypes.gold); // 자원 값
const [resourceCount, setResourceCount] = useState(''); // 자원 개수
const [isNullValue, setIsNullValue] = useState(false);
@@ -209,7 +209,7 @@ const EventRegist = () => {
const item_cnt = resultData.item_list[itemIndex].item_cnt;
resultData.item_list[itemIndex].item_cnt = Number(item_cnt) + Number(resourceCount);
} else {
- const name = wellType.find(well => well.value === resource).name;
+ const name = currencyType.find(well => well.value === resource).name;
const newItem = { item: resource, item_cnt: resourceCount, item_name: name };
resultData.item_list.push(newItem);
}
@@ -403,7 +403,7 @@ const EventRegist = () => {
setResource(e.target.value)} value={resource}>
- {wellType.map((data, index) => (
+ {currencyType.filter(data => data.value !== currencyCodeTypes.calium).map((data, index) => (
diff --git a/src/pages/ServiceManage/Items.js b/src/pages/ServiceManage/Items.js
index 3d01f62..77a0f52 100644
--- a/src/pages/ServiceManage/Items.js
+++ b/src/pages/ServiceManage/Items.js
@@ -146,7 +146,6 @@ const Items = () => {
const ConfirmChild = () => {
if(selectedRows === undefined || selectedRows.length === 0) return;
const selectRow = selectedRows[0];
- console.log(selectRow)
return(
{t('DEL_COUNT_CONFIRM', {count: selectRow?.count})}
diff --git a/src/pages/ServiceManage/MailRegist.js b/src/pages/ServiceManage/MailRegist.js
index de26e77..9ef6505 100644
--- a/src/pages/ServiceManage/MailRegist.js
+++ b/src/pages/ServiceManage/MailRegist.js
@@ -19,7 +19,7 @@ import {
import IconDelete from '../../assets/img/icon/icon-delete.png';
import CloseIcon from '../../assets/img/icon/icon-close.png';
-import { benItems, HourList, MinuteList, wellType } from '../../assets/data';
+import { benItems, HourList, mailType, MinuteList, currencyType, userType } from '../../assets/data';
import { useNavigate } from 'react-router-dom';
import MailRegistUploadBtn from '../../components/ServiceManage/MailRegistUploadBtn';
@@ -35,6 +35,7 @@ import { useDataFetch } from '../../hooks/hook';
import { alertTypes, currencyCodeTypes } from '../../assets/data/types';
import { useLoading } from '../../context/LoadingProvider';
import { useAlert } from '../../context/AlertProvider';
+import { userType2 } from '../../assets/data/options';
const MailRegist = () => {
const navigate = useNavigate();
@@ -44,14 +45,12 @@ const MailRegist = () => {
const { showModal, showToast } = useAlert();
const { withLoading } = useLoading();
- const [doubleSubmitFlag, setDoubleSubmitFlag] = useState(false);
-
const [sendHour, setSendHour] = useState('00');
const [sendMin, setSendMin] = useState('00');
const [item, setItem] = useState('');
const [itemCount, setItemCount] = useState('');
- const [resource, setResource] = useState('19010001');
+ const [resource, setResource] = useState(currencyCodeTypes.gold);
const [resourceCount, setResourceCount] = useState(0);
const [isNullValue, setIsNullValue] = useState(false);
@@ -61,8 +60,6 @@ const MailRegist = () => {
const [excelName, setExcelName] = useState(null);
const [isItemNullValue, setIsItemNullValue] = useState(false);
- const [isResourceNullValue, setIsResourceNullValue] = useState(false);
- const [alertMessage, setAlertMessage] = useState('');
const {
data: caliumTotalData,
@@ -96,6 +93,35 @@ const MailRegist = () => {
guid: '',
});
+ useEffect(() => {
+ // 세션 스토리지에서 복사된 메일 데이터 가져오기
+ const copiedMailData = sessionStorage.getItem('copyMailData');
+
+ if (copiedMailData) {
+ const mailData = JSON.parse(copiedMailData);
+
+ setResultData({
+ is_reserve: mailData.is_reserve,
+ send_dt: '',
+ mail_type: mailData.mail_type,
+ receive_type: mailData.receive_type,
+ user_type: mailData.user_type,
+ mail_list: mailData.mail_list,
+ item_list: mailData.item_list,
+ resource_list: mailData.resource_list,
+ guid: mailData.receive_type === 'SINGLE' ? mailData.guid : ''
+ });
+
+ if (mailData.receive_type === 'MULTIPLE') {
+ setExcelFile(null);
+ setExcelName(null);
+ }
+
+ // 사용 후 세션 스토리지 데이터 삭제
+ sessionStorage.removeItem('copyMailData');
+ }
+ }, []);
+
useEffect(() => {
if (checkCondition()) {
setIsNullValue(false);
@@ -125,32 +151,35 @@ const MailRegist = () => {
}
item.length === 0 || itemCount.length === 0 ? setIsItemNullValue(true) : setIsItemNullValue(false);
- // const token = sessionStorage.getItem('token');
- const result = await MailIsItem(token, { item: item });
+ await withLoading(async () => {
+ return await MailIsItem(token, { item: item });
+ }).then(data => {
+ if (data.result === 'ERROR') {
+ showToast(data.data.message, { type: alertTypes.warning });
+ }else{
+ if (item.length === '' || itemCount.length === 0 || itemCount <= 0) {
+ setIsItemNullValue(true);
+ } else if (item.length !== 0) {
+ setIsItemNullValue(false);
+ const itemIndex = resultData.item_list.findIndex(
+ data => data.item === item
+ );
- if (result.data.result === 'ERROR') {
- showToast(result.data.data.message, { type: alertTypes.warning });
- return;
- }
+ if (itemIndex !== -1) {
+ showToast('MAIL_ITEM_ADD_DUPL', { type: alertTypes.warning });
+ return;
+ }
+ const newItem = { item: item, item_cnt: itemCount, item_name: data.data.item_info.item_name };
- if (item.length === '' || itemCount.length === 0 || itemCount <= 0) {
- setIsItemNullValue(true);
- } else if (item.length !== 0) {
- setIsItemNullValue(false);
- const itemIndex = resultData.item_list.findIndex(
- (item) => item.item === resource,
- );
-
- if (itemIndex !== -1) {
- showToast('MAIL_ITEM_ADD_DUPL', { type: alertTypes.warning });
- return;
+ resultData.item_list.push(newItem);
+ setItem('');
+ setItemCount('');
+ }
}
- const newItem = { item: item, item_cnt: itemCount, item_name: result.data.data.item_info.item_name };
+ }).catch(e => {
+ showToast(e, { type: alertTypes.error });
+ });
- resultData.item_list.push(newItem);
- setItem('');
- setItemCount('');
- }
};
const onItemRemove = id => {
@@ -213,7 +242,7 @@ const MailRegist = () => {
return;
}
}
- const name = wellType.find(well => well.value === resource).name;
+ const name = currencyType.find(well => well.value === resource).name;
const newItem = { item: resource, item_cnt: resourceCount, item_name: name };
resultData.item_list.push(newItem);
}
@@ -222,11 +251,6 @@ const MailRegist = () => {
}
};
- const onResourceRemove = id => {
- let filterList = resultData.resource_list && resultData.resource_list.filter(item => item !== resultData.resource_list[id]);
- setResultData({ ...resultData, resource_list: filterList });
- };
-
// 발송 날짜 세팅 로직
const handleSelectedDate = data => {
const sendDate = new Date(data);
@@ -317,9 +341,8 @@ const MailRegist = () => {
const checkCondition = () => {
return resultData.mail_list.every(data => data.content !== '' && data.title !== '') &&
(resultData.receive_type === 'MULTIPLE' ? excelFile !== null : resultData.guid !== '') &&
- (resultData.is_reserve ? resultData.send_dt.length !== 0 : resultData.send_dt.length === 0) &&
+ (resultData.is_reserve ? resultData.send_dt.length !== 0 : true) &&
resultData.mail_type !== 'SELECT'
- && !alertMessage
};
return (
@@ -375,10 +398,11 @@ const MailRegist = () => {
setResultData({ ...resultData, mail_type: e.target.value })}
value={resultData.mail_type}>
-
-
-
-
+ {mailType.filter(data => data.value !== 'ALL').map((data, index) => (
+
+ ))}
@@ -389,9 +413,14 @@ const MailRegist = () => {
setResultData({ ...resultData, user_type: e.target.value })}
- value={resultData.user_type} disabled={resultData.receive_type !== 'SINGLE'}>
-
-
+ value={resultData.user_type}
+ disabled={resultData.receive_type !== 'SINGLE'}
+ >
+ {userType2.map((data, index) => (
+
+ ))}
@@ -436,8 +465,6 @@ const MailRegist = () => {
setResultData={setResultData}
resultData={resultData}
excelFile={excelFile}
- alertMessage={alertMessage}
- setAlertMessage={setAlertMessage}
setExcelFile={setExcelFile}
excelName={excelName}
setExcelName={setExcelName}
@@ -541,24 +568,6 @@ const MailRegist = () => {
theme={itemCount.length === 0 || item.length === 0 ? 'disable' : 'search'}
handleClick={handleItemList} width="100px" height="35px" />
- {/* {isItemNullValue && 필수값을 입력해주세요.}
-
-
- {resultData.item_list && (
-
- {resultData.item_list.map((data, index) => {
- return (
- -
-
- {data.item}({data.item_cnt})
-
- onItemRemove(index)}>
-
- );
- })}
-
- )}
- */}
|
@@ -568,10 +577,11 @@ const MailRegist = () => {
|
setResource(e.target.value)} value={resource}>
-
-
-
-
+ {currencyType.map((data, index) => (
+
+ ))}
handleResourceCount(e)} width="200px" />
@@ -634,12 +644,6 @@ const MailRegist = () => {
export default MailRegist;
-const InputRow = styled.div`
- display: flex;
- flex-wrap: wrap;
- gap: 10px 50px;
-`;
-
const InputItem = styled.div`
display: flex;
align-items: center;
diff --git a/src/styles/ModuleComponents.js b/src/styles/ModuleComponents.js
index ae8eb59..700cce1 100644
--- a/src/styles/ModuleComponents.js
+++ b/src/styles/ModuleComponents.js
@@ -825,4 +825,10 @@ export const StyledSelectInput = styled(SelectInput)`
export const TimeSeparator = styled.span`
color: #94a3b8;
margin: 0 2px;
+`;
+
+export const CopyBtn = styled.div`
+ position: absolute;
+ right: 0;
+ top: 0;
`;
\ No newline at end of file
| | |