Browse Source

QNA 관리자 문의 삭제 기능 작업

pull/2/head
김장현 11 months ago
parent
commit
af9112e8c6
  1. 2
      src/@core/layouts/components/menu/vertical-menu/VerticalNavMenuGroup.js
  2. 7
      src/components/cstmrService/inquiry/QnaDetail.js
  3. 8
      src/components/cstmrService/inquiry/QnaSearchBox.js
  4. 86
      src/containers/cstmrService/inquiry/AdminInquiryContainer.js
  5. 23
      src/modules/cstmrService/inquiry/action/index.ts
  6. 3
      src/modules/cstmrService/inquiry/apis/index.ts
  7. 9
      src/modules/cstmrService/inquiry/model/index.ts
  8. 43
      src/modules/cstmrService/inquiry/sagas/index.ts

2
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);

7
src/components/cstmrService/inquiry/QnaDetail.js

@ -18,7 +18,8 @@ export default function QnaDetatil({
adminDetailForm,
handlerChangeDetailForm,
handlerSubmitDetailForm,
handlerFileDownload
handlerFileDownload,
handlerDeleteConfirQna
}) {
return (
<Modal
@ -198,7 +199,9 @@ export default function QnaDetatil({
</ModalBody>
<ModalFooter>
<div className='pal-form-btn'>
<Button color='danger'>삭제</Button>
<Button color='danger' onClick={handlerDeleteConfirQna}>
삭제
</Button>
<Button color='secondary' onClick={handlerDetailModal}>
취소
</Button>

8
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'

86
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}
/>
<InfoModal
modal={validationModal.successType}
setModal={val => {
setValidationModal({
...validationModal,
successType: {
...val
}
});
}}
/>
<ConfirmModal
modal={validationModal.confirmType}
setModal={val => {
setValidationModal({
...validationModal,
confirmType: {
...val
}
});
}}
handlerConfirm={handlerDeleteQna}
/>
</Row>
);

23
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
)<IQnaAdminFileDown[], {}, AxiosError>();
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<typeof actions>;

3
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}`);
}
};

9
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 {

43
src/modules/cstmrService/inquiry/sagas/index.ts

@ -66,9 +66,12 @@ function* adminAnswerSaga(
action: ActionType<typeof Actions.ADMIN_ANSWER.request>
) {
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<typeof Actions.ADMIN_DELETE.request>
) {
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);
}

Loading…
Cancel
Save