diff --git a/src/@core/layouts/components/menu/vertical-menu/VerticalNavMenuGroup.js b/src/@core/layouts/components/menu/vertical-menu/VerticalNavMenuGroup.js index 6aab19cb..43293583 100644 --- a/src/@core/layouts/components/menu/vertical-menu/VerticalNavMenuGroup.js +++ b/src/@core/layouts/components/menu/vertical-menu/VerticalNavMenuGroup.js @@ -29,6 +29,8 @@ const VerticalNavMenuGroup = ({ // ** Current Val const currentURL = useLocation().pathname; const currentSearch = useLocation().search; + + // 관제에서 laanc 신청 페이지 넘어올시 left menu target useEffect(() => { if (currentSearch === '?map=true') { toggleOpenGroup(item.id, parentItem); diff --git a/src/components/cstmrService/inquiry/QnaDetail.js b/src/components/cstmrService/inquiry/QnaDetail.js index 41f413aa..f71a183f 100644 --- a/src/components/cstmrService/inquiry/QnaDetail.js +++ b/src/components/cstmrService/inquiry/QnaDetail.js @@ -18,7 +18,8 @@ export default function QnaDetatil({ adminDetailForm, handlerChangeDetailForm, handlerSubmitDetailForm, - handlerFileDownload + handlerFileDownload, + handlerDeleteConfirQna }) { return (
- + diff --git a/src/components/cstmrService/inquiry/QnaSearchBox.js b/src/components/cstmrService/inquiry/QnaSearchBox.js index b9603478..54c200b6 100644 --- a/src/components/cstmrService/inquiry/QnaSearchBox.js +++ b/src/components/cstmrService/inquiry/QnaSearchBox.js @@ -2,6 +2,10 @@ import { Button, Card, CardBody, Col, Row, Input } from 'reactstrap'; import { Search } from 'react-feather'; const categoryList = [ + { + title: '전체', + value: '' + }, { title: '칭찬', value: '칭찬' @@ -25,6 +29,10 @@ const categoryList = [ ]; const anserStatusList = [ + { + title: '전체', + value: '' + }, { title: '답변 대기', value: 'N' diff --git a/src/containers/cstmrService/inquiry/AdminInquiryContainer.js b/src/containers/cstmrService/inquiry/AdminInquiryContainer.js index 3987164b..6e038d01 100644 --- a/src/containers/cstmrService/inquiry/AdminInquiryContainer.js +++ b/src/containers/cstmrService/inquiry/AdminInquiryContainer.js @@ -5,15 +5,18 @@ import { ADMIN_LIST, ADMIN_DETAIL, ADMIN_ANSWER, - ADMIN_FILE_DOWN + ADMIN_FILE_DOWN, + ADMIN_DELETE } from '../../../modules/cstmrService/inquiry/action'; import QnaSearchBox from '../../../components/cstmrService/inquiry/QnaSearchBox'; import QnaGrid from '../../../components/cstmrService/inquiry/QnaGrid'; import QnaDetail from '../../../components/cstmrService/inquiry/QnaDetail'; +import { InfoModal } from '../../../components/modal/InfoModal'; +import { ConfirmModal } from '../../../components/modal/ConfirmModal'; const initalSearch = { - category: '칭찬', - anserStatus: 'N', + category: '', + anserStatus: '', createUserNm: '' }; @@ -21,6 +24,23 @@ export default function AdminInquiryContainer() { const [searchData, setSearchData] = useState(initalSearch); const [isDetailModal, setIsDetailModal] = useState(false); const [adminDetailForm, setAdminDetailForm] = useState({}); + const [validationModal, setValidationModal] = useState({ + errorType: { + isOpen: false, + desc: '', + title: '필수값 입력 오류' + }, + successType: { + isOpen: false, + desc: '', + title: '필수값 입력 오류' + }, + confirmType: { + isOpen: false, + desc: '', + title: '필수값 입력 오류' + } + }); const { adminList: lists, adminDetail } = useSelector( state => state.qnaState ); @@ -81,12 +101,42 @@ export default function AdminInquiryContainer() { const { anserContent, anserStatus, qnaSno } = adminDetailForm; dispatch( ADMIN_ANSWER.request({ - anserContent, - anserStatus, - qnaSno + search: { ...searchData }, + form: { + anserContent, + anserStatus, + qnaSno + } }) ); setIsDetailModal(false); + setValidationModal({ + ...validationModal, + successType: { + title: '저장', + isOpen: true, + desc: '저장 되었습니다.' + } + }); + }; + + // Qna 삭제 Confirm + const handlerDeleteConfirQna = () => { + setValidationModal({ + ...validationModal, + confirmType: { + isOpen: true, + title: '삭제', + desc: '정말 삭제하시겠습니까?' + } + }); + }; + + // Qna 삭제 + const handlerDeleteQna = () => { + const { qnaSno } = adminDetailForm; + dispatch(ADMIN_DELETE.request({ ...searchData, qnaSno })); + setIsDetailModal(false); }; return ( @@ -109,6 +159,30 @@ export default function AdminInquiryContainer() { handlerChangeDetailForm={handlerChangeDetailForm} handlerSubmitDetailForm={handlerSubmitDetailForm} handlerFileDownload={handlerFileDownload} + handlerDeleteConfirQna={handlerDeleteConfirQna} + /> + { + setValidationModal({ + ...validationModal, + successType: { + ...val + } + }); + }} + /> + { + setValidationModal({ + ...validationModal, + confirmType: { + ...val + } + }); + }} + handlerConfirm={handlerDeleteQna} /> ); diff --git a/src/modules/cstmrService/inquiry/action/index.ts b/src/modules/cstmrService/inquiry/action/index.ts index 9397a421..0bda95f2 100644 --- a/src/modules/cstmrService/inquiry/action/index.ts +++ b/src/modules/cstmrService/inquiry/action/index.ts @@ -32,6 +32,11 @@ const ADMIN_FILE_DOWN_REQUEST = 'cstmrService/qna/ADMIN_FILE_DOWN_REQUEST'; const ADMIN_FILE_DOWN_SUCCESS = 'cstmrService/qna/ADMIN_FILE_DOWN_SUCCESS'; const ADMIN_FILE_DOWN_FAILURE = 'cstmrService/qna/ADMIN_FILE_DOWN_FAILURE'; +// 관리자 문의 삭제 +const ADMIN_DELETE_REQUEST = 'cstmrService/qna/ADMIN_DELETE_REQUEST'; +const ADMIN_DELETE_SUCCESS = 'cstmrService/qna/ADMIN_DELETE_SUCCESS'; +const ADMIN_DELETE_FAILURE = 'cstmrService/qna/ADMIN_DELETE_FAILURE'; + export const ADMIN_LIST = createAsyncAction( ADMIN_LIST_REQUEST, ADMIN_LIST_SUCCESS, @@ -58,12 +63,28 @@ export const ADMIN_FILE_DOWN = createAsyncAction( ADMIN_FILE_DOWN_FAILURE )(); +export const ADMIN_DELETE = createAsyncAction( + ADMIN_DELETE_REQUEST, + ADMIN_DELETE_SUCCESS, + ADMIN_DELETE_FAILURE +)< + { + category: string; + anserStatus: string; + createUserNm: string; + qnaSno: number; + }, + {}, + AxiosError +>(); + const actions = { ADMIN_LIST, ADMIN_DETAIL, ADMIN_DETAIL_INITAL, ADMIN_ANSWER, - ADMIN_FILE_DOWN + ADMIN_FILE_DOWN, + ADMIN_DELETE }; export type QnaAction = ActionType; diff --git a/src/modules/cstmrService/inquiry/apis/index.ts b/src/modules/cstmrService/inquiry/apis/index.ts index cc9bdc4c..0b94edae 100644 --- a/src/modules/cstmrService/inquiry/apis/index.ts +++ b/src/modules/cstmrService/inquiry/apis/index.ts @@ -43,5 +43,8 @@ export const qnaAPI = { }) ); // return await axios.get(data.downloadUrl); + }, + adminDelete: async (qnaSno: number) => { + return await axios.delete(`api/cns/qna/${qnaSno}`); } }; diff --git a/src/modules/cstmrService/inquiry/model/index.ts b/src/modules/cstmrService/inquiry/model/index.ts index 7398ef39..419ee659 100644 --- a/src/modules/cstmrService/inquiry/model/index.ts +++ b/src/modules/cstmrService/inquiry/model/index.ts @@ -52,9 +52,12 @@ export interface IQnaAdminDetail { } export interface IQnaAdminAnswer { - anserContent: string; - anserStatus: string; - qnaSno: number; + form: { + anserContent: string; + anserStatus: string; + qnaSno: number; + }; + search: IQnaAdminSearch; } export interface IQnaAdminFileDown { diff --git a/src/modules/cstmrService/inquiry/sagas/index.ts b/src/modules/cstmrService/inquiry/sagas/index.ts index 661b2e0b..f98585c6 100644 --- a/src/modules/cstmrService/inquiry/sagas/index.ts +++ b/src/modules/cstmrService/inquiry/sagas/index.ts @@ -66,9 +66,12 @@ function* adminAnswerSaga( action: ActionType ) { try { - const payload = action.payload; - const res = yield call(Apis.qnaAPI.adminAnswer, payload); - const { data, count, errorCode } = res; + const { search, form } = action.payload; + const res = yield call(Apis.qnaAPI.adminAnswer, { + ...form + }); + console.log(action.payload); + const { errorCode } = res; if (errorCode) { // 오류메시지 호출 @@ -83,7 +86,7 @@ function* adminAnswerSaga( return; } - // yield put(Actions.ADMIN_ANSWER.success(data)); + yield put(Actions.ADMIN_LIST.request({ ...search })); } catch (error) { yield put(Actions.ADMIN_ANSWER.failure(error)); } @@ -95,7 +98,7 @@ function* adminFileDownSaga( try { const payload = action.payload; const res = yield call(Apis.qnaAPI.adminFileDown, payload); - const { data, count, errorCode } = res; + const { errorCode } = res; if (errorCode) { // 오류메시지 호출 @@ -116,9 +119,39 @@ function* adminFileDownSaga( } } +function* adminDeleteSaga( + action: ActionType +) { + try { + const { category, anserStatus, createUserNm, qnaSno } = action.payload; + const res = yield call(Apis.qnaAPI.adminDelete, qnaSno); + const { errorCode } = res; + + if (errorCode) { + // 오류메시지 호출 + yield put( + MessageActions.IS_ERROR({ + errorCode: errorCode, + errorMessage: '처리중 오류가 발생하였습니다', + isHistoryBack: false, + isRefresh: false + }) + ); + + return; + } + yield put( + Actions.ADMIN_LIST.request({ category, anserStatus, createUserNm }) + ); + } catch (error) { + yield put(Actions.ADMIN_DELETE.failure(error)); + } +} + export function* qnaSaga() { yield takeEvery(Actions.ADMIN_LIST.request, adminListSaga); yield takeEvery(Actions.ADMIN_DETAIL.request, adminDetailSaga); yield takeEvery(Actions.ADMIN_ANSWER.request, adminAnswerSaga); yield takeEvery(Actions.ADMIN_FILE_DOWN.request, adminFileDownSaga); + yield takeEvery(Actions.ADMIN_DELETE.request, adminDeleteSaga); }